App Group---APP之间数据共享

  • 实际开发中,我们也许会有这种需求:公司有两个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"]);

推荐阅读更多精彩内容