Morris_
2019.06.14
AppGroup是什么
AppGroup是一个App组,里面可以有若干个App,AppGroup组是个虚无的存在,若干个App通过同一个AppGroup组的标识来连接起来,这个标识就是App Groups Entitlement下key对应的value。
同一个App需要加入多个不同的AppGroup的话,只需要在App Groups Entitlement下的App Groups下添加新的item,填入AppGroup的唯一标识。
关于APP Groups网上资比较多。
AppGroup的作用
App Group主要作用是实现跨进程数据共享,在不同的App之间可以互访问同一块内存区间。
轻量级的数据用NSUserDefaults对AppGroup组里的数据进行访问,比较大的数据使用NSFileManager进行数据访问。
AppGroup相当于建立了一个通道,若干个App都可以通过这个通道来实现数据共享。
AppGroup使用
1、创建AppGroup
在Apple Developer的证书管理目录下,找到Identifiers,有一个App Groups,在这里面创建一个AppGroup。
2、AppID配置AppGroup
在Identifiers下的App IDs选项下,选择需要设置AppGroup的App ID,选择App Group,配置上创建的AppGroup。
3、工程配置App Group
回到项目中,打开项目中的App Group选项。TARGET->Capabilities->App Groups。打开该选项。
打开之后项目中会出现一个xxx.entitlements。打开里面是AppGroup的信息。
在实现录屏直播时候,添加的Broadcast Upload Extension和Broadcast Setup UI Extension也打开这个开关设置,就建立起来了宿主App、Broadcast Upload Extension和Broadcast Setup UI Extension之间数据共享通道。
4、共享数据
4.1 NSUserDefaults
在App之间建立起Group通道后,在任何一个App中写入数据:
NSUserDefaults *userDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"xxx"];
[userDefaults setValue:@"value" forKey:@"key"];
这里使用initWithSuiteName这个方法,创建一个跨进程读写操作的NSUserDefaults对象,SuiteName即是AppGroup id。
在另外一个App中读取数据:
NSUserDefaults *userDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"xxx"];
NSString *value = [userDefaults valueForKey:@"key"];
这是在两个有相同AppGroup的App之间,对同一块存储空间进行数据访问的例子。虽然是两个App,但是有相同的AppGroup。
感觉不好的地方放就是这里的key和value毕竟不像在一个App里,要两个App约定好数据类型和key。
在录屏直播过程中,Broadcast Upload Extension和宿主App之间可以进行如上的操作进行数据共享,将宿主App的数据传到Broadcast Upload Extension,也可以将Broadcast Upload Extension的数据传到宿主App中。
4.2 NSFileManager
写入数据
- (BOOL)saveData:(NSData *)data toFile:(NSString *)filename
{
NSURL *groupURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.xxx.group"];
NSURL *fileURL = [groupURL URLByAppendingPathComponent:filename];
if ([[NSFileManager defaultManager] fileExistsAtPath:fileURL.path])
{
if ([data writeToURL:fileURL atomically:NO]) {
NSLog(@"write sucess");
return YES;
}
return NO;
}
else
{
return [[NSFileManager defaultManager] createFileAtPath:[fileURL path] contents:data attributes:nil];
}
return NO;
}
读取数据
- (NSData *)dataFromFile:(NSString *)filename
{
NSURL *groupURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.xxx.group"];
NSURL *fileURL = [groupURL URLByAppendingPathComponent:filename];
return [[NSFileManager defaultManager] contentsAtPath:[fileURL path]];
}