最近有个需求需要来电识别企业内部通讯录的号码,即不将企业通讯录的信息加入到系统通讯录中,实现来电识别。类似于大数字、鹅厂的来电识别、骚扰拦截功能

准备工作

  • 使用Realm存储内部通讯录的数据,Realm的具体操作可查看Realm的文档

  • 为了使Extension能获取到主程序沙盒中的通讯录数据,我们可以开启App Groups实现宿主程序数据库共享,记得调用NSFileManager的containerURLForSecurityApplicationGroupIdentifier,实效数据库共享

  • 开启数据库共享后我们就可以在Extension中获取到号码库中的数据了


CallKit部分

  • 新建一个Call Directory Extension的扩展

  • 系统默认有一个模板,根据数据进行增量或者全量处理,CallKit默认将号码一条条进行写入,写入前必须将号码进行从小到大的顺序进行排列好依次写入

    1
    [context addIdentificationEntryWithNextSequentialPhoneNumber:phoneNumber label:label];
  • 号码库下载完成后可在主Target中调用Extension的入口函数进行数据的更新

    1
    2
    3
    4
    CXCallDirectoryManager *manager = [CXCallDirectoryManager sharedInstance];
    [manager reloadExtensionWithIdentifier:@"com.fangpengjun.CallDirectoryDemo.CallDirectory" completionHandler:^(NSError * _Nullable error) {

    }];

开始识别

  • 写入前先检查来电阻止与身份识别的权限,开启后再进行数据的写入操作

注意事项:

  • 号码库在写入前必须从小到大进行排列好
  • 号码不能有重复
  • 手机号码加上86,座机加上区号,虚拟网短号无需处理,所有号码不能以0为开头