![](http://www.ctiforum.com/uploadfile/2018/0111/20180111044933375.jpg)
![](http://www.ctiforum.com/uploadfile/2018/0111/20180111044946490.jpg)
![](http://www.ctiforum.com/uploadfile/2018/0111/20180111045055230.jpg)
小伙伴,接下来跟着我一起开始实时通话集成吧
一、PushKit介绍
PushKit从iOS 8版本开始支持,具体实现如下:
- app需要开启推送,且后台模式勾选Voice over IP;
- 创建PushKit推送证书,证书创建类型选择VoIP Services Certificate,具体生成过程不再赘述与普通推送证书过程一样;
- 引用PushKit.framework库;
- 注册PushKit推送通知,代码如下:
![](http://www.ctiforum.com/uploadfile/2018/0111/20180111045310309.jpg)
![](http://www.ctiforum.com/uploadfile/2018/0111/20180111045323217.jpg)
PushKit与原来远程推送的区别:
原来远程推送是由服务器发出消息之后,iPhone设备收到消息,由iOS 系统弹出通知窗口。
PushKit是由服务器发出消息之后,iPhone设备收到消息后,会在后台启动app(在设备上看不到,即使双击Home也看不到),消息会送达到回调函数里,由应用决定怎么处理该消息,如弹出本地通知或做一些其他操作;后台时间有限,不能做过于耗时操作。
PushKit和原来远程推送是共存的,所以在系统里需要两个证书,也会有对应的push token生成;呼叫模块会根据PushKit证书和对应的push token同时存在推送PushKit推送,否则还走原来的远程推送逻辑。
二、CallKit介绍:
CallKit是从iOS 10开始支持,需要引用CallKit.framework库。
优点:
- 提高网络通话的音频权限:避免在通话过程中被传统电话无脑打断,更顺畅!
- 可以使用系统电话的UI界面:实时语音通话真正地变成了“电话”!
简单介绍:
首先得介绍一下CallKit的框架。他分为三大模块:通话管理,CallCenter和来电屏蔽,要实现上述功能我们只需要关注通话管理模块。通话管理模块里主要有两个类:CXProvider和CXCallController。
CXProvider可以理解为处理系统电话界面有关的逻辑,比如来电呼起系统电话界面或者将用户在系统电话界面上的操作通知给App。 CXCallController则是将用户在App界面上的操作通知给系统。
CallKit来电场景的介绍:
网络通话适配CallKit主要包含三个流程:收到来电主动通知CallKit、用户在CallKit界面点击接听、用户在App界面点击挂断。下面将通过三个流程来介绍CXProvider、CXCallController的使用。
App收到来电
![](http://www.ctiforum.com/uploadfile/2018/0111/20180111045355198.jpg)
收到SDK的onIncomingCallReceived回调消息时,其他逻辑不变只需要调用CXProvider的reportNewIncomingCall就可以展示系统电话界面。
![](http://www.ctiforum.com/uploadfile/2018/0111/20180111045457734.jpg)
用户在CallKit界面点击接听,该流程可用于用户对Callkit的所有操作回调:
![](http://www.ctiforum.com/uploadfile/2018/0111/20180111045559944.jpg)
用户点击接听后,我们会受到CXAnswerCallAction的回调,在这里面添加acceptCall接听来电,再调用fulfill,整个流程就完成了。在前面判断如果callid不存在字典中显示失败。
![](http://www.ctiforum.com/uploadfile/2018/0111/20180111045622124.jpg)
用户在App中挂断电话
![](http://www.ctiforum.com/uploadfile/2018/0111/20180111050807904.jpg)
这时候我们需要添加一个CXEndCallAction到CXTransaction并调用requestTransaction请求执行:
![](http://www.ctiforum.com/uploadfile/2018/0111/20180111051113746.jpg)
之后的流程与CallKit界面点击接听类似,收到CXEndCallAction回调,执行挂机逻辑,调用fulfill完成流程。所有用户在app内的操作都以这种方式通知CallKit:
![](http://www.ctiforum.com/uploadfile/2018/0111/20180111051125366.jpg)
上面简单介绍来电的场景,希望大家举一反三,在App中补充其他的电话流程。
三、系统适配问题:
根据上面所讲内容,iOS 8和iOS 9是支持PushKit但不支持CallKit,如果这个时候收到PushKit的通知就需要应用来做本地推送,这样会造成工作量的增加;所以在注册PushKit的时候,判断当前系统是否支持CallKit,支持CallKit再注册PushKit推送,这样服务器会判断当前没有PushKit的token会走原来的推送;当然如果PushKit有其他用途的就另当别论了。