【腾讯Bugly干货分享】QQ电话适配iOS10 Callkit框架

本文来自于腾讯bugly开发者社区,非经做者赞成,请勿转载,原文地址:http://dev.qq.com/topic/58009392302e4725036142fchtml

Dev Club 是一个交流移动开发技术,结交朋友,扩展人脉的社群,成员都是通过审核的移动开发工程师。每周都会举行嘉宾分享,话题讨论等活动。ios

本期,咱们邀请了 腾讯 SNG iOS 开发工程师“段定龙”,为你们分享《QQ电话适配iOS10 Callkit框架分享》。服务器

分享内容简介:微信

苹果在iOS 10开放了系统电话权限,全新的Callkit框架可以让音视频的第三方应用得到系统级的通话体验,本次分享将主要介绍如何应用Callkit框架和一些适配经验。网络

下面是本期分享内容整理session


你们好,我是来自腾讯SNG的段定龙,目前负责QQ音视频iOS客户端的开发工做,很高兴今天和你们分享一下QQ电话适配iOS10 Callkit的经验。架构

今天将从4个方面进行分享:app

  1. Callkit概述
  2. Callkit框架
  3. 适配经验分享
  4. 更多资料

1. Callkit 概述

苹果在2016年的WWDC大会上推出了iOS10,提供了一系列更加开放的新特性,其中最吸引咱们的就是Callkit,这个框架可以让第三方应用得到系统电话的权限以及体验。什么概念呢?上图吧。框架

这个框架解决了VoIP通话的三个痛点:ide

  1. 提升网络通话的音频权限:避免在通话过程当中被传统电话无脑打断,更顺畅!
  2. 可使用系统电话的UI界面:QQ电话真正地变成了“电话”!
  3. 可使用系统服务,丰富了入口:好比锁屏的时候能够直接接听,经过系统通话沉淀发起和Siri唤起通话等

不得不给苹果点个赞,需求已宣讲,下面咱们来看看怎么实现如此炫酷的体验。

2. Callkit 框架

2.1 总体结构

首先得介绍一下Callkit的框架。他分为三大模块:VoIP,CallCenter和来电屏蔽,要实现上述功能咱们只须要关注Voip模块。Voip模块里主要有两个类:CXProvider和CXCallController。

CXProvider能够理解为处理系统电话界面有关的逻辑,好比来电呼起系统电话界面或者将用户在系统电话界面上的操做通知给App。 CXCallController则是将用户在App界面上的操做通知给系统。

2.2 四个主要流程的接口模块使用

更具体地,网络通话适配Callkit主要包含四个流程:收到来电主动通知Callkit、用户在Callkit界面点击接听、用户在手Q界面点击挂断、用户在系统通信录发起新的通话。下面将经过四个流程来介绍CXProvider、CXCallController、INIntent事件的使用,触类旁通。

首先咱们看最简单的收到来电主动通知Callkit:

收到服务器信令通知后只须要调用CXProvider的reportNewIncomingCall就能够了。调用事后系统通信录会自动沉淀,系统电话界面会展现。

图中的setCategory是为了不出现无声问题,这个在后面会进行解释。

而后是用户在Callkit界面点击接听,这里的流程通用于用户对Callkit的操做回调:

用户点击接听后,咱们会受到CXAnswerCallAction的回调,只须要在这里面添加App原来的音视频通话逻辑,再调用fulfill,整个流程就完成了。

再而后是用户在App内点击挂断

这时候咱们须要添加一个CXEndCallAction到CXTransaction并调用requestTransaction请求执行,以后的流程与Callkit界面点击接听相似,收到CXEndCallAction回调,执行相应逻辑,调用fulfill完成流程。全部用户在app内的操做都以这种方式通知Callkit。

最后咱们来看一下如何从App外部发起,以系统通信录为例子(Siri实际上是同样样的)

用户在点击系统通信录的沉淀后,咱们会收到系统事件通知(INStartAudioCallIntent或者INStartVideoCallIntent),而后就相似于用户在App内点击挂断的流程,只不过此次换成发起了,添加CXStartCallAction到CXTransaction并调用requestTransaction请求执行,收到CXStartCallAction的回调,执行相应逻辑后调用fulfill完成流程。

以上即是网络通话中主要的4个场景流程,不知道你们对CXProvider和CXCallController的功能和使用场景是否已经有一个大体的了解。最后用一张图来再解释一下:

适配过总的结构如图所示,系统界面由系统本身控制,咱们没有办法直接对其进行操做,这里有点坑,有不少苹果的BUG没法避免,咱们须要CXCallController去通知系统更新,并经过CXProvider的回调处理在系统界面上的操做。

回顾了一下整个Callkit的架构后,下面将分享一些适配时候的经验,包括ID的对应和无声问题的处理

3. 手Q适配框架及经验

3.1 适配手Q音视频架构

Callkit的架构里有两个ID标志,UUID和CXHandle,前者是用于表示每一次通话,后者则是用于标识具体的用户,好比reportNewIncomingCall的时候咱们须要新的UUID去标识此次通话,而在系统通信录沉淀的时候,则使用CXHandle区分用户。

QQ号码是一套独立的ID体系,区别于手机号,因此咱们须要定义特殊的CXHandle字符串,并将UUID,CXHandle和QQ本身的AVID联系起来,统一管理。

3.2 无声问题的坑

整个适配过程当中,咱们遇到最大的问题就是出现通话无声问题,因为没有任何文档,在无数次的尝试后得出结论,苹果对于Callkit和App的音频接口调用顺序有严格的要求,若是不按照一下顺序来调用会出现无声问题甚至Crash:

稍微给大伙儿一点时间,看看这个图

图中不一样颜色表明不一样的流程,系统音频模块(AVAudioSession)分为六个操做:

  • 初始化(AudioUnitInit)
  • 去初始化(AudioUnitUninit)
  • 通知激活(didActivateSession)
  • 开启音频(AudioUnitStart)
  • 通知结束(didDeativateSession)
  • 关闭音频(AudioUnitStop)

重点其实就两个:

  1. 在流程开始前setCategory为PlayAndRecord
  2. 调用音频模块函数的时机: 发起通话: Callkit回调 -> 初始化 -> fulfill -> 通知激活 -> 开启音频 结束通话: Callkit回调 -> fulfill -> 通知结束 -> 关闭音频 -> 去初始化

4. 结语

最后提一下Pushkit通道的使用能够保证用户杀进程或者退后台了,依然能够后台唤起进程,完成通话,不过这不是今天的重点,就带过了。

因为苹果对整个架构真的没有什么文档解释,全部的工做都是在适配的过程当中进行摸索,每一个beta版本的接口都有所变更,太细节性的东西今天就不一一介绍了。

固然咱们能够从一下途径得到更多资料(聊胜于无)

官方文档

https://developer.apple.com/reference/callkit

WWDC2016视频介绍

https://developer.apple.com/videos/play/wwdc2016/230/

WWDC2016演示文档

http://devstreaming.apple.com/videos/wwdc/2016/230b83wfxc7m69dm90q/230/230_enhancing_voip_apps_with_callkit.pdf

SpeakerBox: Using Callkit to create a VoIP app(9.13有更新的版本)

https://developer.apple.com/library/prerelease/content/samplecode/Speakerbox/Introduction/Intro.html

今天的分享讲到这里就结束拉,谢谢你们,若是有任何问题,欢迎你们提出来。

互动问答

Q1:什么是系统通信录的沉淀是指在来电话后拒接,而后显示在通话记录里吗?

系统通信录沉淀,就是好比打传统电话的时候,咱们在电话app中最近通话里会有此次通话的记录,使用callkit后,全部未接,已接,呼出都会在最近通话中现实

Q2:uuid只是在通话中使用?若是发生变化有什么影响?

uuid只是用于每次通话过程成表示本次通话,相同用户的不一样通话uuid是不一样的,结束通话后这个uuid就没有意义了。

Q3:系统通信录打电话不是用的系统电话,能够调起qq电话?

若是是由qq电话产生的通话记录,那么点击发起的时候会调用qq电话。

Q4:pushkit来唤醒app,有失败的可能吗?可靠性如何?

有失败的可能,好比咱们后台向苹果后台发送,可是最终苹果后台没有给客户端下发,或者延时下发。目测仍是比较可靠的,具体数据我这没有。成功率目测至少9成以上吧。

Q5:APP向下兼容到iOS7时,须要作些什么处理呢?

这个特性只在iOS10上适用,注意作好版本保护就行。

Q6:在系统通话记录中若是是 qq 电话,直接点击会发起qq 电话,这就是你说的 pushkit 嘛,唤醒程序,刚试了下,中间有次次失败了,还有就是对此次的通话 uuid,qq 的 id 这个是哪里获得的?

系统通话记录点击发起QQ电话并非Pushkit, 而是Callkit提供的新特性。uuid是APP内生成的,qq的AVID取决于不一样业务,也能够说是qq本身定义的。只是这是不一样体系下的id须要作一些对应,通信录发起时带的是cxhandle。至于bug。麻烦提供一下号码?后续跟进给你个答复

Q7:除了在不按照顺序来调用会出现无声问题甚至Crash,还有其它什么状况会致使该问题的发生?

主要注意设置一下avaudiosession的类型为playandrecord,否则也会致使无声


更多精彩内容欢迎关注bugly的微信公众帐号:

腾讯 Bugly是一款专为移动开发者打造的质量监控工具,帮助开发者快速,便捷的定位线上应用崩溃的状况以及解决方案。智能合并功能帮助开发同窗把天天上报的数千条 Crash 根据根因合并分类,每日日报会列出影响用户数最多的崩溃,精准定位功能帮助开发同窗定位到出问题的代码行,实时上报能够在发布后快速的了解应用的质量状况,适配最新的 iOS, Android 官方操做系统,鹅厂的工程师都在使用,快来加入咱们吧!

相关文章
相关标签/搜索