首页 > 代码库 > 不同App之间共享数据
不同App之间共享数据
我们知道iOS由于沙盒的存在,应用程序不能越过自己的区域去访问别的存储空间的内容,不过可能有许多场景我们需要在应用程序之间共享数据,比如多个应用共用用户名密码进行登录等。虽然我们不能直接通过文件系统来共享数据,不过还是有些方法可以实现。
这里,我们新建两个工程,T1:负责写数据,T2:负责读数据。
方法一:UIPasteboard
剪贴板是应用程序之间传递数据的简单方式,建议不要使用全局的粘贴板,而是自己根据名字创建一个新的粘贴板,防止其它地方全局拷贝的影响。然后把需要共享的内容复制到粘贴板,粘贴板的内容可以是文本、URL、图片和UIColor等,另一个app就可以根据粘贴板的名字去读取相关的信息。
T1设置剪贴板内容:
UIPasteboard *pasteboard = [UIPasteboard pasteboardWithName:@"myPasteboard" create:YES]; pasteboard.string = @"myShareData";
T2读取剪贴板内容:
UIPasteboard *pasteboard = [UIPasteboard pasteboardWithName:@"myPasteboard" create:NO]; NSString *content = pasteboard.string;
方法二:共享钥匙串
iOS的keychain提供一种安全保存信息的方式,可以保存密码等数据,而且keychain中的数据不会因为你删除app而丢失,你可以在重新安装后继续读取keychain中的数据。通常每个应用程序只允许访问自己在keychain中保存的数据,不过假如你使用同一个证书的话,不同的app也可以通过keychain来实现应用间的数据共享。
为了实现keychain共享数据,我们需要开启Keychain Sharing,开启方法如下,然后添加设置相同的Keychain Group,不过别忘记了添加Security.framework。
注:钥匙串清理的时机:1、重置手机;2、使用代码手动清理。除了这两种情况,其他情况都不会被清理。
T1应用保存数据至keyChain,T2应用从keyChain读取数据:
#import "ViewController.h" #import <SAMKeychain/SAMKeychain.h> @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // T1应用保存数据至keyChain [SAMKeychain setPassword:@"qwe" forService:@"sss" account:@"qqq"]; } @end
#import "ViewController.h" #import <SAMKeychain/SAMKeychain.h> @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // T2应用从keyChain读取数据 NSString *s = [SAMKeychain passwordForService:@"sss" account:@"qqq"]; NSLog(@"%@",s); } @end
方法三:App Groups
iOS8之后苹果加入了App Groups功能,应用程序之间可以通过同一个group来共享资源,app group可以通过NSUserDefaults进行小量数据的共享,如果需要共享较大的文件可以通过NSFileCoordinator、NSFilePresenter等方式。
开启app groups,两个应用T1和T2都需要添加一个相同的group name,app之间通过这个group共享数据。
#import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // T1通过AppGroup的名字创建信号设置并设置数据 NSUserDefaults *myDefaults = [[NSUserDefaults alloc]initWithSuiteName:@"group.yss"]; [myDefaults setObject:@"shared data" forKey:@"mykey"]; } @end
#import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // T2根据AppGroup的名字创建偏号设置并读取数据 NSUserDefaults *myDefaults = [[NSUserDefaults alloc]initWithSuiteName:@"group.yss"]; NSString *content = [myDefaults objectForKey:@"mykey"]; NSLog(@"%@",content); } @end
方法四:通过Custom URL Scheme
这个主要是应用跳转方面的知识,就不在这里做过多讲解了。
不同App之间共享数据