CallKit中数据共享

CallKit“来电阻止和身份识别”数据共享

CallKit作为一个扩展应用(Extension target)

容器应用(Containing App)是我们自己的应用

载体应用(Host App)扩展应用的触发应用,CallKit的载体应用(Host App)是“设置->电话->来电阻止和身份识别->开关按钮”

CallKit对于容器应用来讲是一个独立的应用,它有自己的进程、运行空间和运行资源,并且和容器应用不能进行直接的数据交互,只能通过共享区的方式,Apple的事项方式是APP Groups。具体步骤如下:

1、打开 “项目->Capabilities”,找到App Groups的数据栏

CallKit中数据共享_第1张图片

2、点击添加按钮进行添加ID


CallKit中数据共享_第2张图片

添加完以后如下图(如下错误点击fix):


CallKit中数据共享_第3张图片

3、容器应用(Containning APP)中编写添代码:

3.1、检查权限

[manager getEnabledStatusForExtensionWithIdentifier:@"com.test.testCallKit" completionHandler:^(CXCallDirectoryEnabledStatus enabledStatus, NSError * _Nullable error) {

NSString *title = nil;

if (!error) {

if (enabledStatus == CXCallDirectoryEnabledStatusDisabled) {

/*

CXCallDirectoryEnabledStatusUnknown = 0,

CXCallDirectoryEnabledStatusDisabled = 1,

CXCallDirectoryEnabledStatusEnabled = 2,

*/

title = @"来电弹屏功能未授权,请在'设置'->'电话'->'来电阻止与身份识别'中授权";

}else if (enabledStatus == CXCallDirectoryEnabledStatusEnabled) {

title = @"来电弹屏功能已授权";

}else if (enabledStatus == CXCallDirectoryEnabledStatusUnknown) {

title = @"未知错误";

}

}else{

title = @"有错误";

}

}];

3.2、向共享区中写入数据(实例是将一个plist文件中的数据写入):

//plist数据

NSString *plistPath = [[CallKitDataManager sharedCallKitDataManager]plistPath];

NSMutableDictionary *data = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath];

NSError *err = nil;

NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.shares.test"];

containerURL = [containerURL URLByAppendingPathComponent:@"Library/Caches/callKitData"];

[containerURL removeAllCachedResourceValues];

BOOL result = [data writeToURL:containerURL atomically:YES];

if (!result) {

NSLog(@"%@",err);

} else {

NSLog(@"save success.");

}

return result;

3.3、CallKit应用(Extension target)中获取数据并且写入系统

NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"com.shares.test"];    containerURL = [containerURL URLByAppendingPathComponent:@"Library/Caches/callKitData"];    NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithContentsOfURL:containerURL];        NSArray*PhoneNames = dict[@"phoneNameArr"];    NSArray*phoneNumbers = dict[@"phoneNumArr"];

for (NSUInteger i = 0; i < phoneNumbers.count; i += 1) {

NSNumber *number = phoneNumbers[i];

CXCallDirectoryPhoneNumber phoneNumber;

#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64

phoneNumber = number.unsignedLongValue;

#else

phoneNumber = number.unsignedLongLongValue;

#endif

NSString *label = PhoneNames[i];

NSLog(@"来点提示:%@ :%lld",label,phoneNumber);

[context addIdentificationEntryWithNextSequentialPhoneNumber:phoneNumber label:label];

到此,全部过程完成。

你可能感兴趣的:(CallKit中数据共享)