【关注 融云寰球互联网通信云 】2016 年,苹果 iOS10 公布了 CallKit 框架,使第三方 VoIP 类型语音通话类 APP,能够领有与手机零碎一样的复电体验——间接显示在锁屏界面,并且通话过程中,APP 的音视频权限和运营商电话一样,不会被其余利用打断。如何实现?
2018 年,苹果 APP 审核核心通过邮件告知开发者:在中国大陆地区上架的 APP 不可应用 Callkit。
并且,从 iOS13 开始,基于平安角度思考,苹果要求在应用 VoIP 推送时必须配合 CallKit 框架应用,否则 iOS 零碎将在收到 VoIP 推送后杀掉 APP 过程,就像没有收到 VoIP 推送一样。
苹果 CallKit 框架无奈在国内上架应用,咱们也就无奈在国内应用 VoIP 推送性能在手机后盾唤醒息屏了的 APP。
然而,对于在没有上架限度地区投放的利用,苹果 CallKit 仍然是晋升用户应用体验的重要伎俩。
当下,出海浪潮浩浩荡荡,融云作为布局寰球的通信云服务商,为寰球开发者提供平安、牢靠的互联网通信云服务。上架海内利用商店的 APP,在应用融云 SDK 取得稳固通信能力后集成苹果 CallKit,能够大幅提高用户体验和应用便捷性。
本文分享通过苹果 CallKit 框架实现复电、接听、挂断、呼叫等通话场景的流程。
苹果 CallKit 成果
在 iPhone 锁屏状态下 APP 复电时,通过苹果 CallKit 能够像 iOS 原生电话复电一样展示全屏的复电及接听界面,VoIP APP 与零碎 Call 有着雷同的通话优先级别,而且在通讯录中的拔号记录、Siri 唤起、勿扰模式等都能够失去很好的反对。
(苹果 CallKit 框架下的 APP 复电界面)
(苹果 CallKit 框架下的 APP 接听界面)
下图简略形容了原生 APP、第三方 APP 在 CallKit 框架下的关系。CallKit 在零碎中提供了一种独有的服务,在须要的时刻,原生或者第三方 APP 通过 CallKit 提供的 API 向零碎申请诸如复电、插入等展示服务,由 Call Service 统一安排调度这些申请以达成对立的交互响应。
(原生和第三方 APP 在 CallKit 框架下的关系)
如何应用苹果 CallKit
苹果 CallKit 提供了对立的语音通话 UI 及与该 UI 交互的 API,但理论的通话链路监听、搭建和治理还须要沿用 APP 原有的实现思路。上面,咱们分享复电、插入等场景下 APP 与 CallKit 的交互流程。
Prepare
① 创立 CXProvider,指定 CallKit 展示 UI 中的 APP 名称和图标、通话数量、复电铃声等 Configuration
② 实现 CXProviderDelegate 协定,以接管来自 Call Service 发来的更新状态,例如用户点击了接听或者挂断等动作,决定网络链路的解决动作;还有 AudioSession 的激活状态,决定 Audio 播放录制的启动敞开机会
③ 创立 CXCallController,使 APP 能够发送更新状态给 Call Service,例如用户插入电话或者对方挂断电话等状态
④ 如果需锁屏界面及 APP 未启动状态下显示复电界面,要搭建 PushKit 通路,与 APNS 差不多,只是 APP 端解决形式有些不同。
(筹备工作)
Incoming Call
① APP 前台时收到来自网络 Server 端的连贯申请,或者 APP 后盾时收到来自网络 Push Server 的 PushEvent
② APP 收到连贯申请或者 Push 音讯后,创立 CXCallUpdate 对象,指定此次复电的号码等属性
③ 将下面创立的 CXCallUpdate 对象通过 CXProvider 的 reportNewIncomingCall WithUUID 办法报告给 iOS 零碎
④ Call Service 收到新的复电申请后依据以后的状态,展示原生复电 UI
(复电场景实现流程)
Answer Call
① 用户点击复电界面上的接听按钮
② Call Service 通过 CXProvider 的 Delegate 协定 performAnswerCallAction 办法告知 APP
③ APP 将接听命令通过网络传给对端,开始理论音频数据传输,进行通话
(接听场景实现流程)
End Call
① 用户点击 APP UI 中的挂断按钮
② 创立 CXEndCallAction 对象,指定此次通话的 UUID 属性
③ 创立 CXTransaction,将 Action 指定给它
④ 通过 CXCallController,调用 request Transaction 将这个挂断事件告诉给 Call Service
⑤ Call Service 通过以后通话状态,通过 CXProvider 将挂断动作告诉回给 APP
⑥ 在 CXProviderDelegate 中的 performEnd CallAction 中完结此次通话的网络链路,进行音频录制播放 Loop
(挂断场景实现流程)
Outgoing Call
① 用户通过 APP UI、通话录、Siri 发动一个插入申请
② 创立 CXHandle 指定拨出的电话号码,创立 CXStartCallAction 并将 CXHandle 指定给它
③ 创立 CXTransaction,将刚刚的 Action 指定给它
④ 通过 CXCallController 调用 request Transaction,将这个插入事件告诉给 Call Service
⑤ Call Service 收到新的拨出申请后依据以后的状态,通过 CXProvider 将拨出动作告诉回 APP
⑥ 在 CXProviderDelegate 中的 perform StartCallAction 中开启此次呼叫的网络链路,通过 CXProvider 的 reportOutgoing CallWithUUID 设置呼叫与接通工夫,依据链路建设的后果来展示原生呼叫 UI 的状态(呼叫胜利或者失败)
(拨出场景实现流程)
苹果 CallKit 开发框架,赋予语音或视频通话利用的开发者诸多便当——
容许开发者将 UI 界面整合在 iPhone 原生的电话 APP 中;
容许开发者将通信 APP 的性能内建在电话 APP 的“罕用联系资讯”以及“通话记录”,不便用户透过原生电话 APP,间接取用这些第三方性能;
容许用户在告诉核心间接浏览并回复复电,复电的画面也将整合在 iOS 原生的 UI 里。
总而言之,苹果 CallKit 让 iOS 本来单纯用来打电信电话的“电话”性能,可能联合泛滥第三方语音通信软件,具备更残缺的数码电话能力。而对融云服务的宽广出海开发者来说,集成苹果 CallKit,利用内的 VOIP 通话能够取得零碎级的通话成果,极大地晋升用户应用体验。