iOS应用程序之间数据共享

来源:互联网 发布:淘宝儿童食品代理 编辑:程序博客网 时间:2024/05/22 08:16

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
来举个例子,详细使用,请点击该链接






 

0 0
原创粉丝点击