初始化方法
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;