iOS应用程序间共享数据
我们知道由于iOS有安全沙盒机制,应用之间是不能直接访问,但是Apple友好的提供了四种访问机制
它们分别是:
1. 粘贴板 UIPasteboard
2. 自定义URL Scheme
3. App Groups
4. 钥匙串
以下,就详细的说说它们的原理和具体怎么使用。
首先,创建两个项目, 它们分别是:PSharedData1,PSharedData2
1. 粘贴板 UIPasteboard
例如:有道词典,在搜索词的文本框里点击时
百度浏览器, QQ浏览器,在搜索关键词时,
会把从别处复制到剪切板的内容给自动显示出来
PSharedData1里,我们把数据通过UIPasteboard设置进去,然后启动PSharedData2,读取UIPasteboard里的内容
详细代码:
在PSharedData1项目里
- (void)viewDidLoad {
[super viewDidLoad];
UIImage *im1 = [UIImage imageNamed:@"2.png"];
UIImage *im2 = [UIImage imageNamed:@"2.png"];
UIImage *im3 = [UIImage imageNamed:@"2.png"];
UIColor *c1 = [UIColor redColor];
UIColor *c2 = [UIColor redColor];
UIColor *c3 = [UIColor redColor];
UIPasteboard *pasteboard = [UIPasteboard pasteboardWithName:@"com.xiaoruigege.pasteboard" create:YES];
pasteboard.strings = @[@"aa",@"bb",@"cc",@"dd"];
pasteboard.images = @[ im1, im2, im3];
pasteboard.colors = @[c1, c2, c3];
}
在PSharedData2项目里
- (void)viewDidLoad {
[super viewDidLoad];
UIPasteboard *pasteboard = [UIPasteboard pasteboardWithName:@"<pre name="code" class="objc">com.xiaoruigege.pasteboard
" create:NO]; NSArray<NSString *> *strings = pasteboard.strings; NSArray<UIImage *> *images = pasteboard.images; NSArray<UIColor *> *colors = pasteboard.colors; NSLog(@"string: %@, colors : %@, images: %@", strings, colors, images);}
注意:UIPasteboard可以存放NSString, UIImage, UIColor, 但是每次设值,只能存放一种数据类型,以最后一次赋值为主
比如:我在PSharedData1项目里,同时设置了三种数据类型和数据
pasteboard.strings = @[@"aa",@"bb",@"cc",@"dd"];
pasteboard.images = @[ im1, im2, im3];
pasteboard.colors = @[c1, c2, c3];
但是,从
PSharedData2项目里,取出值,仅仅只有colors有值,因为colors在设值时,是最后一个
NSArray<NSString *> *strings = pasteboard.strings;
NSArray<UIImage *> *images = pasteboard.images;
NSArray<UIColor *> *colors = pasteboard.colors;
2.自定义URL Scheme
例如:我们分享微博时,第三方应用使用QQ, 微信等登陆时
从我们自己的客户端跳转到到微博,QQ客户端时,使用的就是自定义URL
当然,也可以作为我们从一个客户端跳转另一个客户端时通过制定URL,并且可以传参数,且参数是不可见的
详细代码:
在PSharedData1项目中的info.plist文件中配置如下
URL identifier 一般可以取公司域名倒置
URL Schemes 是关键,它是一个Array,表示可以用多种方式打开,我这里定义xiaoruigege, 即表示其他项目可以通过 xiaoruigege://就可以打开PSharedData1项目(就是自己)
但是在iOS9中,必须要在打开的项目里配置白名单(被打开项目的URL Scheme)
在PSharedData2项目里,配置白名单,适用于iOS9.0及以上,iOS8.0及以下不用配置,也可以打开
info.plist配置是
通过PSharedData2项目,打开PSharedData1项目的调用代码
NSURL *url = [NSURL URLWithString:@"xiaoruigege://param=1&m=2"];
[[UIApplication sharedApplication] openURL:url];
自定义URL xiaoruigege://param=1&m=2
param=1&m=2 这是参数列表
PSharedData1项目打开后,会执行如下appDelegate中的代理函数
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
if ([[url scheme] hasPrefix:@"xiaoruigege://"]) {
//解析URL获取数据
return YES;
}
return NO;
}
3. App Groups
iOS8之后苹果加入了App Groups功能,应用程序之间可以通过同一个group来共享资源,app group可以通过NSUserDefaults进行小量数据的共享,
如果需要共享较大的文件可以通过NSFileCoordinator、NSFilePresenter等方式。
开启app groups,需要添加一个group name,app之间通过这个group共享数据:
步骤:点击项目 -> 选择相应的Target -> 选择Capabilities项 -> 点开App Groups -> 点击下面的加号,添加一个字符串作为标识 ,group.xiaoruigege.shareddata 是我自己写的标识
把PSharedData1项目和PSharedData2项目的这块设置成一致,就OKAY了
设值
NSUserDefaults *myDefaults = [[NSUserDefaults alloc]
initWithSuiteName:@"group.xiaoruigege.shareddata"];
[myDefaults setObject:@"group.xiaoruigege.shareddata" forKey:@"mykey"];
取值
NSUserDefaults *myDefaults = [[NSUserDefaults alloc]
initWithSuiteName:@"group.xiaoruigege.shareddata"];
NSString *content = [myDefaults objectForKey:@"mykey"];
NSLog(@"AppGroups: %@", content);
4. KeyChain 钥匙串
iOS的keychain提供一种安全保存信息的方式,可以保存密码等数据,而且keychain中的数据不会因为你删除app而丢失,你可以在重新安装后继续读取keychain中的数据。通常每个应用程序只允许访问自己在keychain中保存的数据,不过假如你使用同一个证书的话,不同的app也可以通过keychain来实现应用间的数据共享
为了实现keychain共享数据,我们需要开启Keychain Sharing,开启方法如下,然后添加设置相同的Keychain Group,不过别忘记了添加Security.framework。
将项目和项目的这里设置成一样,就可以达到两个项目互相设值并且访问
这里的代码以开源库https://github.com/VictorZhang2014/ZRKeyChain
来举个例子,详细使用,请点击该链接
标签:pasteboard,UIPasteboard,URL,PSharedData1,iOS,应用程序,xiaoruigege,colors,数据共享 From: https://blog.51cto.com/u_14062833/6320524