前不久苹果推出的callkit framework简直就是voip类应用的福音啊,一下把应用的体验提升到了系统级别的高度,加上之前推出的pushkit,形成了一套完整的voip解决方案。正好我们的产品就是一个类voip应用,当然要把callkit加进去,不过callkit刚刚推出,网上的资料实在是少,甚至连官方的api文档里都是大片空白,下面记录一下我对整合callkit的一些总结与理解,也算丰富一下网上的相关资料吧。
一、嵌入后效果
首先,先对Callkit框架嵌入后的实际使用效果有个直观的概念,可以使用手机qq中的qq电话功能(qq已经做了Callkit的框架嵌入)。拨叫、被叫的等业务自己尝试几次,可以发现:
呼出时:直接在qq应用内触发,没有系统电话界面的显示,整个通话过程中的操作都是在qq应用内部完成的,但是通话结束后,系统通话记录中会出现此次对应的通话记录。
被叫时:会显示出系统的电话接听界面,整个通话过程中的操作都可以借助系统通话界面完成,双击home键,可以看到qq应用被启动了,并跳转到了接听界面,用户可以随意切换,通话过程中操作既可以使用系统界面完成,也可以使用qq应用内接听界面完成,最后通话结束后,系统通话记录中会多出此次对应的通话记录。
二、核心类
callkit框架主要围绕的就是CXProvider以及CXCallController两个核心类
关于CXProvider、CXCallController,有文章里是这么描述的:
CXProvider类主要负责 系统->程序方向 的信息、状态传递
CXCallController类主要负责 程序->系统方向的 信息、状态传递
这种描述并没有错误,但是却会让我在有些地方产生困惑,下文我会提到我的困惑,并尝试给出我的理解
三、流程示例
注:不同app的具体实现肯定是各不相同,但会话建立的整体流程应该都是大同小异的,下文的示例是依据我们app的实现写的,看的时候,不要太过纠结于细节或个别环节的差异,应该从整体流程上去体会callkit框架嵌入后带来的变化,最后再结合自己app的实际情况,去做自己的嵌入实现
1.被叫流程
未加入callkit前:
服务器通知app有来电->app显示接听界面->选择接听,进入app通话界面,应答服务器,建立话音通道->通话->挂断电话或被对方挂断
加入callkit框架后:
服务器通知app有来电->调用CXProvider的reportNewIncomingCallWithUUID方法告知系统有来电,系统显示出系统接听界面->选择接听,系统回调performAnswerCallAction,进入app通话界面->系统通知 audiosession可用didActivateAudioSession->应答服务器,建立话音通道->通话->挂断电话或被对方挂断
主要区别:
1.未加入callkit前,接听界面是app提供的,整个流程都掌控在app内部;加入后,首先要调用reportNewIncomingCallWithUUID通知系统有来电,让系统显示出系统接听界面。
2.加入callkit后,用户在系统接听界面选择接听后,不能立即建立话音通道,需要等待didActivateAudioSession的回调
被叫流程代码示例
(1)app调用reportNewIncomingCallWithUUID告知系统有来电,系统显示出系统接听界面
CXCallUpdate *callUpdate = [[CXCallUpdate alloc] init];
CXHandle *handle = [[CXHandle alloc] initWithType:CXHandleTypePhoneNumber value:callInfo.phoneNum];
callU