iOS 10 CallKit 的简单使用

CallKit 这个开发框架,能够让语音或视讯电话的开发者将 UI 界面整合在 iPhone 原生的电话 App 中.将允许开发者将通讯 App 的功能内建在电话 App 的“常用联络资讯”,以及“通话记录”,方便用户透过原生电话 App,就能直接取用这些第三方功能;允许用户在通知中心就能直接浏览并回覆来电,来电的画面也将整合在 iOS 原生的 UI 里,总体来说,等于让 iOS 原本单纯用来打电信电话的“电话”功能,能够结合众多第三方语音通讯软件,具备更完整的数码电话潜力。CallKit 也拓展了在 iOS 8 就出现的 App Extensions 功能,可以让用户在接收来电时,在原生电话 App 中就透过第三方 App 辨识骚扰电话(例如诈骗).

如何创建一个call项目?

出现下图结构说明创建成功:

来电提醒功能

通过extension模板,创建CallDirectoryExtension
用到的方法:

//开始请求的方法,在打开设置-电话-来电阻止与身份识别开关时,系统自动调用
- (void)beginRequestWithExtensionContext:(CXCallDirectoryExtensionContext *)context;
//添加黑名单:根据生产的模板,只需要修改CXCallDirectoryPhoneNumber数组,数组内号码要按升序排列
- (BOOL)addBlockingPhoneNumbersToContext:(CXCallDirectoryExtensionContext *)context;
// 添加信息标识:需要修改CXCallDirectoryPhoneNumber数组和对应的标识数组;CXCallDirectoryPhoneNumber数组存放的号码和标识数组存放的标识要一一对应,CXCallDirectoryPhoneNumber数组内的号码要按升序排列
- (BOOL)addIdentificationPhoneNumbersToContext:(CXCallDirectoryExtensionContext *)context;
设置
实现流程

在打开设置里的开关后,系统会调用beginRequest方法,在这个方法内部会调用添加黑名单和添加信息标识的方法,添加成功后,再调用completeRequestWithCompletionHandler方法通知系统;

代码的实现:
  • sms:或者是sms://:发送短信;
  • tel: 或者是tel://:打电话
  • telprompt:或者是 telprompt://: 打电话;
  • mailto:发送邮件;
  • http:或者是 http://: 浏览网址;
打电话的按钮
    NSMutableString * str=[[NSMutableString alloc] initWithFormat:@"tel:%@",self.noTextField.text];
    [self.callWebview loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:str]]];
    if (!self.callWebview.subviews) {
        [self.view addSubview:_callWebview];
    }
检查授权:
 CXCallDirectoryManager *manager = [CXCallDirectoryManager sharedInstance];
    // 获取权限状态
    [manager getEnabledStatusForExtensionWithIdentifier:@"com.tq.cccccccccalldemo.CallDirectoryExtension" completionHandler:^(CXCallDirectoryEnabledStatus enabledStatus, NSError * _Nullable error) {
        if (!error) {
            NSString *title = nil;
            if (enabledStatus == CXCallDirectoryEnabledStatusDisabled) {
                /*
                 CXCallDirectoryEnabledStatusUnknown = 0,
                 CXCallDirectoryEnabledStatusDisabled = 1,
                 CXCallDirectoryEnabledStatusEnabled = 2,
                 */
                title = @"未授权,请在设置->电话授权相关权限";
            }else if (enabledStatus == CXCallDirectoryEnabledStatusEnabled) {
                title = @"授权";
            }else if (enabledStatus == CXCallDirectoryEnabledStatusUnknown) {
                title = @"不知道";
            }
            UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"提示"
                                                                           message:title
                                                                    preferredStyle:UIAlertControllerStyleAlert];

            UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault
                                                                  handler:^(UIAlertAction * action) {}];

            [alert addAction:defaultAction];
            [self presentViewController:alert animated:YES completion:nil];
        }else{
            UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"提示"
                                                                           message:@"有错误"
                                                                    preferredStyle:UIAlertControllerStyleAlert];

            UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault
                                                                  handler:^(UIAlertAction * action) {}];

            [alert addAction:defaultAction];
            [self presentViewController:alert animated:YES completion:nil];
        }
    }];
CallDirectoryHandler文件的实现方法:

注意:电话号码前要加区号:+86;电话号码需要升序排列(Numbers must be provided in numerically ascending order.)

/**
 添加黑名单:无法接通
 */
- (BOOL)addBlockingPhoneNumbersToContext:(CXCallDirectoryExtensionContext *)context
/**
 添加信息标识
 */
- (BOOL)addIdentificationPhoneNumbersToContext:(CXCallDirectoryExtensionContext *)context

说明:将项目运行到真机之后,还需要在“设置->电话”设置应用的权限;

项目基本可以达到需求了!黑名单的号码打进来是在通话中,标记的号码显示标记的名字;

标记的号码

这时你会发现你只有第一次运行项目的号码设置才起作用,或者是去设置里面重新授权;显然这是不行的;我们需要实时更新号码:

    CXCallDirectoryManager *manager = [CXCallDirectoryManager sharedInstance];
    [manager reloadExtensionWithIdentifier:@"com.tq.cccccccccalldemo.CallDirectoryExtension" completionHandler:^(NSError * _Nullable error) {
        if (error == nil) {
            UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"提示"
                                                                           message:@"更新成功"
                                                                    preferredStyle:UIAlertControllerStyleAlert];

            UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault
                                                                  handler:^(UIAlertAction * action) {}];

            [alert addAction:defaultAction];
            [self presentViewController:alert animated:YES completion:nil];
        }else{
            UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"提示"
                                                                           message:@"更新失败"
                                                                    preferredStyle:UIAlertControllerStyleAlert];

            UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault
                                                                  handler:^(UIAlertAction * action) {}];

            [alert addAction:defaultAction];
            [self presentViewController:alert animated:YES completion:nil];
        }
    }];
在使用reload时容易出现的问题:
1:出现  Error Domain=com.apple.CallKit.error.calldirectorymanager Code=1 "(null)"        CXErrorCodeCallDirectoryManagerErrorNoExtensionFound 该错误可能出现的原因是identifier   设置的不对 注意不要使用app groups 使用的是Call Directory Extension 的identifier

  2:出现 Error Domain=com.apple.CallKit.error.calldirectorymanager Code=4 "(null)" CXErrorCodeCallDirectoryManagerErrorDuplicateEntries该错误可能出现的原因是:存入的手机号 有重复 检查后去除重复号码

3:出现 Error Domain=com.apple.CallKit.error.calldirectorymanager Code=6 "(null)" CXErrorCodeCallDirectoryManagerErrorExtensionDisabled该错误可能出现的原因是:未开启权限 在设置中->电话->来电阻止与身份识别 开启就行






  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: iOS微信CallKit版的IPA文件是专门为iOS系统设计的一种安装包格式,用于在iPhone上安装微信CallKit版本的应用程序。CallKit是苹果公司推出的一种开发框架,可以使应用程序与iOS系统的电话应用有更好的集成,提供更流畅的通话体验。 通过安装iOS微信CallKit版的IPA文件,用户可以在iPhone上使用微信进行语音通话,并享受到CallKit的诸多优势。例如,CallKit可以将微信通话呼叫集成到iOS系统的电话应用中,使得微信通话可以像普通电话通话一样方便使用。同时,CallKit还能够将来电号码与微信联系人匹配,方便用户识别来电身份,提高通话的便利性和安全性。 要安装iOS微信CallKit版的IPA文件,首先需要确保iPhone已经越狱。接下来,可以通过iTunes或其他第三方软件将IPA文件导入到iPhone中,并在iPhone上进行安装。安装完成后,用户可以在iPhone的主屏幕上找到微信CallKit应用的图标,点击即可打开应用程序。 总之,iOS微信CallKit版的IPA文件是一种用于安装微信CallKit版本应用程序的文件格式,可以在iPhone上使用,提供更流畅的语音通话体验,将微信通话与iOS系统电话应用更好地集成,提高通话的便捷性和安全性。 ### 回答2: iOS微信CallKit版的IPA文件是一种针对iOS操作系统的应用程序安装包文件。它包含了微信应用程序的所有内容,以便在iPhone或iPad设备上进行安装和使用。 CallKit是苹果公司提供的一项技术,可以将通讯应用程序集成到iOS操作系统的电话功能中。通过将微信与CallKit集成,用户可以在使用微信进行语音通话时,享受到更好的通话体验、更稳定的网络连接以及更全面的电话功能。 在安装iOS微信CallKit版的IPA文件之前,需要确保设备已经越狱或者使用第三方安装软件进行安装。然后,可以通过将设备连接到计算机并使用iTunes或其他应用程序管理工具进行安装。 安装完成后,用户可以通过点击微信应用程序图标来启动微信CallKit版。与普通的微信应用程序相比,CallKit版提供了更强大的电话功能,如拨号、接听来电、快速拨号等。在进行语音通话时,用户可以享受到更稳定的网络连接,以及与正常电话通话相似的体验。 总之,iOS微信CallKit版的IPA文件是一种用于安装和使用微信应用程序的文件,它集成了CallKit技术,提供更强大的电话功能和更好的通话体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值