一、关于app groups
app groups是iOS8新开放的一种机制,它可以在一定程度上弥补iOS的沙盒机制对应用间通信的限制。通过app groups,我们可以实现app间的一些数据共享,比如文件,数据等。
二、app groups的实现
1、开启app groups
TARGETS-->AppExtensionDemo-->Capabilities-->App Groups,找到以后,将App Groups右上角的开关打开,然后选择或者新增一个groups,比如我的是group.test,当然这是为了测试随便起得名字,正规点得命名规则应该是:group.com.company.app。
2、代码实现
在一个app工程项目中写入如下代码:
NSDictionary *d = @{@"test":@"123"};
NSURL *pathURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.test"];
pathURL = [pathURL URLByAppendingPathComponent:@"Library/Caches/test.plist"];
[d writeToFile:pathURL.resourceSpecifier atomically:YES ];
NSUserDefaults *user = [[NSUserDefaults alloc] initWithSuiteName:@"group.test";
[user setObject:@"00000" forKey:@"test"];
[user synchronize];
NSDictionary *d = @{@"test":@"123"};
NSURL *pathURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.test"];
pathURL = [pathURL URLByAppendingPathComponent:@"Library/Caches/test.plist"];
[d writeToFile:pathURL.resourceSpecifier atomically:YES ];
NSUserDefaults *user = [[NSUserDefaults alloc] initWithSuiteName:@"group.test";
[user setObject:@"00000" forKey:@"test"];
[user synchronize];
我们可以通过NSFileManager 的 containerURLForSecurityApplicationGroupIdentifier方法获取到相关的app groups的pathURL,通过pathURL.resourceSpecifier可以获取到app groups的路劲,这样我们就在路径下写文件了。这里我们写入了一个测试用的plist。
在另一个app工程项目中写入如下代码:
NSURL *pathURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.test"];
pathURL = [pathURL URLByAppendingPathComponent:@"Library/Caches/test.plist"];
NSDictionary *d = [NSDictionary dictionaryWithContentsOfFile:pathURL.resourceSpecifier];
NSLog(@"%@",d);
NSUserDefaults *user = [[NSUserDefaults alloc] initWithSuiteName:@"group.test"];
NSLog(@"%@",[user objectForKey:@"test"]);
NSURL *pathURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.test"];
pathURL = [pathURL URLByAppendingPathComponent:@"Library/Caches/test.plist"];
NSDictionary *d = [NSDictionary dictionaryWithContentsOfFile:pathURL.resourceSpecifier];
NSLog(@"%@",d);
NSUserDefaults *user = [[NSUserDefaults alloc] initWithSuiteName:@"group.test"];
NSLog(@"%@",[user objectForKey:@"test"]);
如上一样,获取pathURL然后可以读取上面一个app中写入的数据,这样就实现了2个app之间的数据和文件共享。其他的诸如图片,sqlite等等都可以通过这种方式共享。
三、注意事项
app groups的共享仅限于同一个开发账号下的app使用,因为app groups创建是和开发账号关联的。