App Group---APP之间数据共享
2017-11-09 本文已影响2118人
jeckHao
- 实际开发中,我们也许会有这种需求:公司有两个APP,当用户登录其中一个APP后,在下载第二个APP的时候,可以实现自动登录的功能。
- 这种情况如何实现呢?我之前的项目一直都是用第三方类库
KeychainAccess
实现的钥匙串分享数据的模式Keychain share
。但是几天前查资料,开始认识另外一种方式,不依赖第三方库就可以实现,那就是APP Groups。iOS8新开放的功能
配置APP Groups
-
创建两个APP,并且在Apple Developer中创建两个APP的id
创建APPid时,在APP Groups复选框打上对钩
,当我们配置完成App ID之后,会发现App Groups是Configurable状态,这是因为咱们还没有配置相应的app groups,别着急,咱们等会再来管它。 -
还是要打开Apple Developer,在id那一组中又一个App Groups选项,我们新创建一个APP Groups,
111.png这里一共有两个选项,第一个是我们这个app group的描述,第二个是我们app group的id。这个id默认是要group.打头,并且是不能去掉的。
-
现在去配置新创建的两个APP ID,因为再创建的时候勾选了APP Groups,但是并没有配置它,所以它回事黄色的状态,现在点击Edit,进入之后选择新创举的groups。
111.png -
点击Edit---勾选上刚创建好的App Group----配置完成,在返回来看一下咱们的App ID,完美~Enabled状态了。
配置Xcode中的APP Groups
-
分别打开两个程序,切换到Capabilities选项卡,找到App Groups选项,刷新一下,将App developer中的App Groups同步下来,然后勾选上咱们刚才创建的开发组。
111.png -
当我们配置完以后,会在文件目录下多出来一个.entitlements的文件。
如何实现数据共享
配置工作做完了,接下来,就是我们的代码表现的时间了。
在这里,我只创建了一个.txt来存储数据,其他类型的持久化存储同理
- 首先是Main App写入数据
//Main App 通过TextField来向共享文件appGroup.txt中写入数据
- (void)textFieldDidEndEditing:(UITextField *)textField {
//获取App Group的共享目录
NSURL *groupURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.com.simon.app.test"];
NSURL *fileURL = [groupURL URLByAppendingPathComponent:@"appGroup.txt"];
//写入文件
[textField.text writeToURL:fileURL atomically:YES encoding:NSUTF8StringEncoding error:nil];
}
- 接下来是两一个APP读取数据
//Sub App 通过获取appGroup.txt中的数据,展现在label上
//获取App Group的共享目录
NSURL *groupURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.com.simon.app.test"];
NSURL *fileURL = [groupURL URLByAppendingPathComponent:@"appGroup.txt"];
//读取文件
NSString *str = [NSString stringWithContentsOfURL:fileURL encoding:NSUTF8StringEncoding error:nil];
self.shareLabel.text = str;
-
containerURLForSecurityApplicationGroupIdentifier
,没错,就是这个方法,用来在share path中创建share document。 -
NSUserDefaults使用
//初始化一个供App Groups使用的NSUserDefaults对象
NSUserDefaults *userDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.company.appGroupName"];
//写入数据
[userDefaults setValue:@"value" forKey:@"key"];
//读取数据
NSLog(@"%@", [userDefaults valueForKey:@"key"]);