且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

iOS—UIPasteboard使用注意事项

更新时间:2022-08-17 08:16:52

初始化方法

UIPasteboard 的初始化方法主要有3类

//获取系统级别的剪切板
+ (UIPasteboard *)generalPasteboard;
//获取一个自定义的剪切板 name参数为此剪切板的名称 create参数用于设置当这个剪切板不存在时 是否进行创建
+ (nullable UIPasteboard *)pasteboardWithName:(NSString *)pasteboardName create:(BOOL)create;
//获取一个应用内可用的剪切板
+ (UIPasteboard *)pasteboardWithUniqueName;

上面3个初始化方法,分别获取或创建3个级别不同的剪切板,下面我们详解一下在什么情况下用哪种初始化方法

+ (UIPasteboard *)generalPasteboard;
系统级别的剪切板在整个设备***享,而且会持久化,即应用程序被删掉,其向系统级的剪切板中写入的数据依然在。

+ (nullable UIPasteboard *)pasteboardWithName:(NSString *)pasteboardName create:(BOOL)create;自定义的剪切板通过一个特定的名称字符串进行创建,它在应用程序内或者同一开发者开发(必须Bundle Identifier 例com.maoshaoqian.** 星号前部一样)的其他应用程序中可以进行数据共享。举个例子:比如你开发了多款应用,用户全部下载了,在A应用中用户拷贝了一些数据(为了数据安全,不用系统级别的Pasteboard),在打开B应用时就会自动识别,提高用户体验。

注意:要使用不同app共享的话,注意上面加粗的部分,很重要!

+ (UIPasteboard *)pasteboardWithUniqueName;第3个方法创建的剪切板等价为使用第2个方法创建的剪切板,只是其名称字符串为nil,它通常用于当前应用内部。(当然也可以跨应用使用,但必须Bundle Identifier 例com.maoshaoqian.** 星号前部一样

注意:使用第3个方法创建的剪切板默认是不进行数据持久化的,及当应用程序退出后,剪切板中内容将别抹去。若要实现持久化,需要设置persistent属性为YES。

使用剪贴板实例

使用剪贴板,如果需要app间共享

1、不能覆盖原剪贴板信息,比如(淘口令)信息
2、自己写入的业务需要相互覆盖
3、不同的业务,不能相互覆盖,只能增加
4、基本逻辑就是,读取剪贴板,识别自身业务信息,做覆盖或者添加后,再次写入
5、剪贴板无增加信息的API,只有全部覆盖

//根据业务Key,读取剪贴板
-(NSDictionary*)readUIPasteboardBizKey:(NSString*)key{
    UIPasteboard *sysPasteboard = [UIPasteboard generalPasteboard];
    __block NSDictionary *result = nil;
    if(sysPasteboard.hasStrings){
        [sysPasteboard.strings enumerateObjectsUsingBlock:^(NSString * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            if([obj containsString:@"ALIBC2017AFC"]){
                NSDictionary *dicFromPasteboard =[self dictionaryWithString:obj];
                result = dicFromPasteboard[key];
                *stop = YES;
            }
        }];
    }
    return result;
}

//写入剪贴板格式
{"flag":"ALIBC2017AFC","updateDate":${更新时间},${业务key}:${业务数据,map类型}}
//根据业务Key,写入业务数据到剪贴板
-(void)testUIPasteboardBizKey:(NSString*)key data:(NSDictionary*)dic{
    UIPasteboard *sysPasteboard = [UIPasteboard generalPasteboard];
    if(sysPasteboard.hasStrings){
        __block BOOL hasBCDataInPasteboard = NO;
        [sysPasteboard.strings enumerateObjectsUsingBlock:^(NSString * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            if([obj containsString:@"ALIBC2017AFC"]){
                NSDictionary *dicFromPasteboard = [self dictionaryWithString:obj];
                [dicFromPasteboard setValue:dic forKey:key];
                NSString *bizStr =[self stringWithDictionary:dicFromPasteboard];
                NSMutableArray *array = [NSMutableArray arrayWithArray:sysPasteboard.strings];
                [array replaceObjectAtIndex:idx withObject:bizStr];
                sysPasteboard.strings = array;
                hasBCDataInPasteboard = YES;
                *stop = YES;
            }
        }];
        if(!hasBCDataInPasteboard){
            NSString *bizStr = [self stringWithDictionary:@{@"flag":@"ALIBC2017AFC",@"updateDate":[NSDate date],key:dic}];
            sysPasteboard.strings = [sysPasteboard.strings arrayByAddingObject:bizStr];
        }
    }else{
        NSString *bizStr = [self stringWithDictionary:@{@"flag":@"ALIBC2017AFC",@"updateDate":[NSDate date],key:dic}];
        sysPasteboard.strings = [sysPasteboard.strings arrayByAddingObject:bizStr];
    }
}

//以上的方法会覆盖剪贴板中其他类型的数据,比如图片类型,如要完全不覆盖,请使用剪贴板以下API

- (nullable NSData *)dataForPasteboardType:(NSString *)pasteboardType;

- (void)setData:(NSData *)data forPasteboardType:(NSString *)pasteboardType;