美文网首页iOS开发技巧iOS学习移动开发
iOS10新特性之CallKit适配VoIP详解

iOS10新特性之CallKit适配VoIP详解

作者: 井悟空 | 来源:发表于2016-10-07 19:10 被阅读5210次

国庆节过完了,回家好好休息一天,今天好好分享一下CallKit开发。最近发现好多吃瓜问CallKit的VoIP开发适配,对iOS10的新特性开发和适配也在上个月完成,接下来就分享一下VoIP应用如何使用CallKit后台、锁屏接听和号码识别功能。

一、首先使用CallKit能做什么:(一句话,不仅让VoIP应用具有系统电话一样的功能,还能帮助系统实现来电识别等功能;但本身并不具备voip功能)

1.后台或锁屏时直接通过系统电话界面接管VoIP语音来电,并更新回调电话操作到app(包括接听、挂断、暂停/保留、静音、DTMF信息等等);

2.电话黑名单拦截和来电识别拓展功能(这个大家在安卓XX手机管家、卫士上司空见惯了)

3.强调一下CallKit的主要功能是作为平台管理包括VoIP在内的电话,提供统一接听操作管理入口和权限。而不仅仅是有人以为的做提供来电识别拓展的!!!


二、看看CallKit的API类簇功能吧

1、CXCall:电话信息基类,有一个唯一识别符UUID,是系统用以区分一个唯一来电信息的东西、通过这个ID可以地位到特定时刻的特定号码的来电信息。

2、CXCallUpdate:通话过程就是信息和状态的变化过程,CallKit的作用只是在于将通话状态和信息在系统接听界面和应用之间传递 ,通过provider请求进行处理;

3、CXAction/CXCallAction:电话操作载体类,细分包括(电话开始:CXStartCallAction、 接听:CXAnswerCallAction、暂停:CXSetHeldCallAction、静音:CXSetMutedCallAction、群组电话CXSetGroupCallAction、双频多音功能:CXPlayDTMFCallAction、挂断或拒接:CXEndCallAction  )。

4、CXTransaction:操作执行类;CXCallController:话务控制器,每种action在配置好CXTransaction后都需要控制器CXCallController去向系统发起请求来响应操作:- (void)requestTransaction:(CXTransaction *)transaction completion:(void (^)(NSError *_Nullable error))completion;

5、CXProvider/CXProviderDelegate:使用CallKit代接收来电状态的VoIP应用都需要一个初始化一个CXProvider,比如有来电时通过provider告知系统帮我接听、要呼出电话时告知系统这条电话的基本信息、以及各种操作和状态的更新信息会通过协议代理传回应用;并需要设置一个代理类来接受处理CXProviderDelegate 代理任务操作(各种CXAction:接听、挂断、DTMF、免提等本地操作)。使用之前,通过 CXProviderConfiguration来配置app的具体信息(你的VoIP 自己的显示名称、是否要支持视频通话、最大会话分组数、logo、来电提示音等信息),以便在系统通话界面显示。

6、CXCallObserver可以设置一个代理来随时捕获电话信息的更新;

7、******接下来是app extension相关的API类:CXCallDirectory电话的地址,目前只有号码CXCallDirectoryPhoneNumber;CXCallDirectoryExtensionContext:拓展应用中用来接受黑名单号码信息和号码识别信息数据源的类;


三、如何使用和需要哪些:

1、初始化一个CXProvider、CXCallController,看看API,配置好代理,准备接受CXCallUpdate;每一种CXCallAction对应一个CXTransaction去执行,因为他有一个管理队列/// Add the provided action to the receiver's list of actions   - (void)addAction:(CXAction *)action;

//无论何种操作都需要 话务控制器 去 提交请求 给系统

-(void)requestTransaction:(CXTransaction *)transaction completion:(XWCallKitCenterCompletion)completion

 -(void)requestTransaction:(CXTransaction *)transaction{

[_callController requestTransaction:transaction completion:^( NSError *_Nullable error){

if (error !=nil) {

NSLog(@"Error requesting transaction: %@", error);

}else{

NSLog(@"Requested transaction successfully");

}

}];

}

2、在后台或者锁屏时,请求系统代为接听来电(这才是CallKit的主要功能):

[provider reportNewIncomingCallWithUUID:uuid update:update completion:^(NSError * _Nullable error) {

if (error == nil) {

XWCall *call = [[XWCall alloc] initWithUUID:uuid];

call.handle = handle; 

[[XWCallManager sharedManager] addCall:call];

}

completion(error);

}];

3、使用Siri识别来拨打电话、在系统听话记录里回拨等UserActivity回调到你的VoIP网络电话app里,app如何接受这个UserActivity,并发起点VoIP电话请求:详见demo

4、至于做这个号码识别和黑名单拦截就更简单了,你在工程中添加CallDiretoryExtension拓展的时候,它就帮你写好代码了,看懂了自定义数据源就可以了。不过这个功能多数情况没效果,大概是系统权限或者bug吧。

5、另外iOS10已经警告VoIP功能的应用去使用PushKit来接受来电推送,以往的VoIP后台申请不受支持。具体代码很简单,跟remote notification差不多:PKPushRegistry看看API就知道怎么耍了。

******分享这些一来来是回答网友的问询,二来自己总结一下思路清晰点;不喜欢发代码和Demo ,授之以鱼不如授之以渔,自己看懂了自己写个demo跑一下比看别人写的再规范的demo都好,但是如果还是有需要下次再发简版demo。再次强调,callKit但本身并不具备voip功能,不要以为单纯接入CallKit就可以真正童话了,自己本身要具备语音通话功能

潜水了几年,最近觉得朋友和boss说多敲也要多分享总结交流,也许有道理吧,以后有空就吓写写吧!随手写的,欢迎指正,对voip感兴趣的欢迎交流。本人自己制作的voip语音视频通话SDK,需要的联系我:微博:_viviwu_


既然有不少人没搞懂,还是发个简单的CallKit demo吧,star一下手留余香!用objective-C 写的一个简版CallKit Demo,展示iOS10 CallKit的使用介绍 CallKit的基本使用。



相关文章

网友评论

  • zhangyin:可以利用CallKit拨打市话不?
    zhangyin:感谢您的回复!谢谢~ :smiley:
    关于callKit和市话之间的关系、voip和普通市话之间的关系,能展开说说吗?
    我理解,callKit是voip, voip如果想拨打市话,那么需要通过voip的服务商,这个服务商和移动运营商之间有接口,可以将二者打通;
    也就是说,callkit应该是可以支持拨打市话的,只要能够设置正确的服务商接口就行,我这样理解对吗?
    井悟空:@zhangyin 能不能打市话跟callKit没有关系
  • Ann_2f83:你好,我下载了你的demo,测试显示,手机通话记录详情里面的短信和电话是置灰不可用状态,请问这是怎么做到的?
  • 韩大熊宝要姓张:楼主,请问你的pushkit集成之后使用的 推送证书是 Voip类型的证书吗? 先谢谢了。
    井悟空:@韩大熊宝要姓张 这个很简单啊 干嘛要用第三方 我的GitHub好像写过APNS和VoIP Push的使用demo……二者差不多的用法
    韩大熊宝要姓张:@井悟空 大神知道哪个三方现在支持coip证书吗?
    井悟空:@韩大熊宝要姓张 是的 pushkit最初就是为VoIP设计的 这个证书本质其实和apns证书一样
  • 韩大熊宝要姓张:“本身要具备语音通话功能” 请问作者,我们可以通过PushKit + CallKit 就可以实现通话功能了,还是说语音接通了之后,我们还是需要自己提供一个IM连接?
    韩大熊宝要姓张:@井悟空 嗯,明白了,也就是说PushKit是通知到对方,利用callkit打开原生通话界面,利用咱们自身的IM去通讯。 谢谢啦。:+1:
    井悟空:@韩大熊宝要姓张 pushkit是跟通知差不多是做推送的,Callkit是系统提供管理第三方通话的接口,本身都不具备音频通话功能。需要你app本身就有VoIP功能
  • 5859f6ff880f:请问下,我的APP进入后台,收到callkit来电后,被叫直接点击挂断,然后主叫再去拨打callkit,APP却收不到callkit来电了
    井悟空:@SiliconsBauer app打开了后callKit一般是不起作用的
    5859f6ff880f:@井悟空 iOS10以上用callkit处理,以下的用APP内的语音通话处理,我说拨打callkit就是iOS10的时候有电话打过来。
    井悟空:@SiliconsBauer 什么叫拨打callKit呢😖 CallKit的作用只在于 app不在活跃状或锁屏后吊起系统通话UI代处理app语音的
  • 温州的柯:来电识别的功能 楼主熟悉吗
  • 我也憧憬过:类似QQ语音的功能,应用在前台进行udp语音通话,按home键回到后台时像qq一样保持通话,请问可以给点提示吗,想了两天都没想明白
    我也憧憬过:@viviwu 好的,谢谢
    井悟空:正常Voip都以这样啊,iOS支持VoIP后台的 。七八个月没发过贴了,过几天我会发一个以前制作的VoIP的SDK和使用demo到github 你看一下
  • WillyGeek:简书支持markdown语法, 学一下就ok了, 不是你想象中的难用.
  • 935c03c568c7:看完没啥好说的,立马注册简书加关注
  • foolishBoy:请问,在收到来电的系统街面上 点击“Reminder me”,然后打开系统的“Reminders”,怎么能做到像whats up一样有自己app的图标,并可以直接呼叫
  • 98fb1c598953:提交请求的时候报错:Error requesting transaction: Error Domain=com.apple.CallKit.error.requesttransaction Code=1 "(null)"
    找了好久不知道什么问题,望答主解答,谢谢
    sherlock_l:层主告诉我解决办法是: 项目->targets->capabilities->background mode设置on ,把Voice over IP勾上,感谢层主,标记一下
    CNMD_LJ:这个我遇到过,这里的意思你当前请求的uuid不对,如果确保call.uuid没有错误的情况下,只能追加reportCall
  • me007:楼主,iOS10怎么通过voip保持后台。网上搜到的方法好像都过时了,求教:dizzy_face:
    井悟空:iOS10以后VoIP也不允许真后台了,大概是考虑到省电吧, 就用PushKit、加callkit就可以了,加个推送通知,没办法 除非你用定位或其他方式申请后台
  • 若雨千寻:你在代码块用前后三个引号就行了:类似这样''' code ''',markdown语法给你:http://www.jianshu.com/p/q81RER
    井悟空:@若雨千寻 哈哈markdown我当然知道 一开始我不知道简书有markdown模式。但是简书这普通富文本编辑处理的也太烂了,
  • 小小小小小小米:你好,我用xmpp写的聊天,在真机上把应用退到后台的时候有聊天消息会走这个方法(- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message)但是升级系统到最新的后,模拟器上把app放在后台会走上面那个方法,但是真机就不走,以前是在info.plist文件加了voip这个东西真机上(后台)会收到消息,但是现在该怎么办呢,真机就收不到了,你有解决的干法没?急~~~~
    小小小小小小米:@viviwu 好的,谢谢你了,不好意思,这几天忙,才看到。
    井悟空:@鱼背上的小小米 你你的意思是要在iOS10 上保持后台? VoIP需要证书和并把VoIP的tcp stream设置为VoIPtype 其他后应用检查一下是不是系统把应用后台刷新进程杀掉了
  • 75afc06dcc73:等待 同意中
  • 75afc06dcc73:voip不是需要输入ip和端口吗?
    井悟空:好吧:sweat:!下一篇我再说一下开发voip电话
    75afc06dcc73:@viviwu 以前没做过voip,完全不了解 :disappointed_relieved:
    井悟空:我上面不是说的清清楚楚嘛,看都没看完吧!你以前voip是怎样 现在还是怎样,只不过iOS多个callkit接听而已!
  • 75afc06dcc73:iOS10才有的库 那么10以下的怎么办呢?
    井悟空:@dwang 都说了是iOS10的新特性 iOS10以下当然不能用咯!以前是什么样 现在还是什么样啊
  • _keepGoingKeepF:请问下 ,如何将自己app放到原生的联系人UI界面中去
    _keepGoingKeepF:@viviwu 对的
    井悟空:@_keepGoingKeepF 你是说在系统通讯录或通话记录 呼叫选项上出现自己的第三方通讯app候选吧?
    井悟空:@_keepGoingKeepF 什么意思?你表述的很纠结啊
  • 瘦了就是帅哥:请问有demo么?
    faceowener:大神,demo在哪呢?
    瘦了就是帅哥:@viviwu 太帅了,加你了
    井悟空:@瘦了就是帅哥 OK马上放一个简版demo

本文标题:iOS10新特性之CallKit适配VoIP详解

本文链接:https://www.haomeiwen.com/subject/wdbyyttx.html