iOS录屏直播(三)AppGroup

									Morris_
									2019.06.14

AppGroup是什么

App Groups Entitlement

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]];
}

你可能感兴趣的:(#,ReplayKit,#,周报)