尽管App Group在OS X上早已经支持(Enabling App Sandbox),但明确写明不支持iOS。iOS 8又一重大好消息是其宣布即将支持App Group,尽管写这篇文章时,还没有见到苹果官方的iOS App Group文档,但已经成功在程序中测试通过。
说明:本文基于当前XCode最新版本:XCode 6 Beta3
1. App Group简介
App Group用于同一个开发团队开发的App之间,包括App和Extension之间共享同一份读写空间,进行数据共享。同一个团队开发的多个应用之间如果能直接数据共享,将会大大提高用户体验。
此外,iOS 8提供Extension功能之后,App Group就显得尤为必要:当Containning app没有运行,Extension运行的情况下,Extension和Containning app共享信息将是常见需求。
2. 基于App Group进行App/Extension间数据共享
2.1 创建App Group
创建App Group有两种方式:一种是使用Apple Develper portal,另一种是使用XCode,这两种方式的步骤如下:
通过Apple Develper portal创建App Group
填写App Group ID和描述,点继续按钮直到成功创建App Group
通过XCode创建App Group
在XCode中登录,打开App Group开关,选择自己的Development Team
和Portal不一样,在XCode中创建App Group不需要输入描述
2.2 关联App Group
App Group创建成功之后,在App或者Extension中关联App Group。需要注意的是:需要共享数据的App或者Extension必须与同一个App Group关联。关联时,只需要勾选App Group对应的check box即可,XCode会自动执行后续操作,这些操作包括:
2.3 使用App Group读写数据
iOS 8提供两种方式来读写数据,一种是NSUserDefaults,另一种是NSFileManager
通过NSUserDefaults读写数据
- (NSString *)readDataByNSUserDefaults
{
NSUserDefaults *shared = [[NSUserDefaults alloc] initWithSuiteName:@"group.liuli.test"];
NSString *value = [shared valueForKey:@"Sample1"];
return value;
}
- (void)saveTextByNSUserDefaults : (NSString *)value
{
NSUserDefaults *shared = [[NSUserDefaults alloc] initWithSuiteName:@"group.liuli.test"];
[shared setObject:value forKey:@"Sample1"];
[shared synchronize];
}
通过NSFileManager读写数据
- (NSString *)readTextByNSFileManager
{
NSError *err = nil;
NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.liuli.test"];
containerURL = [containerURL URLByAppendingPathComponent:@"LiuLiSharedData"];
NSString *value = [NSString stringWithContentsOfURL:containerURL encoding:NSUTF8StringEncoding error:&err];
return value;
}
- (BOOL)saveTextByNSFileManager
{
NSError *err = nil;
NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.liuli.test"];
containerURL = [containerURL URLByAppendingPathComponent:@"LiuLiSharedData"];
BOOL result = [@"SharedData" writeToURL:containerURL atomically:YES encoding:NSUTF8StringEncoding error:&err];
if (!result) {
NSLog(@"%@",err);
} else {
NSLog(@"Save value success.");
}
return result;
}
为了保证数据读写的一致性,我们可以使用Core Data或者SQLite来存储数据。
写到这里,大家可能会问,共享的数据到底存在哪里,看看下面两张截图大家就明白了:
这是NSUserDefaults方式读写数据的plist文件所在目录
这是NSFileManager方式读写数据的文件所在目录,如果是SQLite,那么数据库文件将会放在这个目录