技术干货 | PushKit和CallKit实现——基于实时语音通话

6
回复
983
查看
[复制链接]

5

主题

6

帖子

28

安币

初级码农

Rank: 1

发表于 2018-3-29 14:32:36 | 显示全部楼层 |阅读模式
苹果在2016年的WWDC大会上推出了iOS10,提供了一系列更加开放的新特性,其中CallKit对实时语音通话业务最实用,这个框架能够让第三方应用获得系统电话的权限以及体验。容联快聊基于PushKit和CallKit提供给用户更好的体验:


110.jpg 111.jpg 112.jpg


小伙伴,接下来跟着我一起开始实时通话集成吧

一、PushKit介绍

PushKit从iOS 8版本开始支持,具体实现如下:
1)app需要开启推送,且后台模式勾选Voice over IP;
2)创建PushKit推送证书,证书创建类型选择VoIP Services Certificate,具体生成过程不再赘述与普通推送证书过程一样;
3)引用PushKit.framework库;   
4)注册PushKit推送通知,代码如下:
114.jpg
5)代理函数的实现:
115.jpg
  • PushKit与原来远程推送的区别

原来远程推送是由服务器发出消息之后,iPhone设备收到消息,由iOS 系统弹出通知窗口。
PushKit是由服务器发出消息之后,iPhone设备收到消息后,会在后台启动app(在设备上看不到,即使双击Home也看不到),消息会送达到回调函数里,由应用决定怎么处理该消息,如弹出本地通知或做一些其他操作;后台时间有限,不能做过于耗时操作。
PushKit和原来远程推送是共存的,所以在系统里需要两个证书,也会有对应的push token生成;呼叫模块会根据PushKit证书和对应的push token同时存在推送PushKit推送,否则还走原来的远程推送逻辑。

二、CallKit介绍:

CallKit是从iOS 10开始支持,需要引用CallKit.framework库.
  • 优点

1) 提高网络通话的音频权限:避免在通话过程中被传统电话无脑打断,更顺畅!
2)可以使用系统电话的UI界面:实时语音通话真正地变成了“电话”!
  • 简单介绍

首先得介绍一下CallKit的框架。他分为三大模块:通话管理,CallCenter和来电屏蔽,要实现上述功能我们只需要关注通话管理模块。通话管理模块里主要有两个类:CXProvider和CXCallController。
CXProvider可以理解为处理系统电话界面有关的逻辑,比如来电呼起系统电话界面或者将用户在系统电话界面上的操作通知给App。 CXCallController则是将用户在App界面上的操作通知给系统。
  • CallKit来电场景的介绍

网络通话适配CallKit主要包含三个流程:收到来电主动通知CallKit、用户在CallKit界面点击接听、用户在App界面点击挂断。下面将通过三个流程来介绍CXProvider、CXCallController的使用。
  • App收到来电
    116.jpg
收到SDK的onIncomingCallReceived回调消息时,其他逻辑不变只需要调用CXProvider的reportNewIncomingCall就可以展示系统电话界面。
117.jpg

  • 用户在CallKit界面点击接听,该流程可用于用户对Callkit的所有操作回调:
    118.jpg
用户点击接听后,我们会受到CXAnswerCallAction的回调,在这里面添加acceptCall接听来电,再调用fulfill,整个流程就完成了。在前面判断如果callid不存在字典中显示失败。
119.jpg
  • 用户在App中挂断电话
    11111.jpg

这时候我们需要添加一个CXEndCallAction到CXTransaction并调用requestTransaction请求执行:
120.jpg
之后的流程与CallKit界面点击接听类似,收到CXEndCallAction回调,执行挂机逻辑,调用fulfill完成流程。所有用户在app内的操作都以这种方式通知CallKit:
121.jpg
上面简单介绍来电的场景,希望大家举一反三,在App中补充其他的电话流程。

三、系统适配问题:

根据上面所讲内容,iOS 8和iOS 9是支持PushKit但不支持CallKit,如果这个时候收到PushKit的通知就需要应用来做本地推送,这样会造成工作量的增加;所以在注册PushKit的时候,判断当前系统是否支持CallKit,支持CallKit再注册PushKit推送,这样服务器会判断当前没有PushKit的token会走原来的推送;当然如果PushKit有其他用途的就另当别论了。

308

主题

995

帖子

684

安币

手工艺人

发表于 2018-3-29 14:34:19 | 显示全部楼层
支持,感谢,祝巴士越来越好~

6

主题

9578

帖子

2865

安币

Android大神

Rank: 6Rank: 6

发表于 2018-3-29 14:38:19 | 显示全部楼层
支持,感谢,祝巴士越来越好~

85

主题

9850

帖子

2190

安币

Android大神

Rank: 6Rank: 6

发表于 2018-3-29 14:42:29 | 显示全部楼层
帮帮顶顶!!

451

主题

1188

帖子

1942

安币

手工艺人

发表于 2018-3-29 14:44:49 | 显示全部楼层
支持楼主,支持安卓巴士!

17

主题

9334

帖子

2321

安币

Android大神

Rank: 6Rank: 6

发表于 2018-3-29 15:07:30 | 显示全部楼层
感谢大神~

11

主题

9474

帖子

971

安币

代码手工艺人

Rank: 4

发表于 2018-3-29 15:14:51 | 显示全部楼层
支持楼主,支持安卓巴士!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

领先的中文移动开发者社区
18620764416
7*24全天服务
意见反馈:1294855032@qq.com

扫一扫关注我们

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粤ICP备15117877号 )