【关注 融云全球互联网通信云】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 通话可以获得系统级的通话效果,极大地提升用户使用体验。

应用出海,如何使用苹果 CallKit 提升网络通话体验相关推荐

  1. 出海有“云”!华为云全球加速助力跨国企业提升网络体验

    对于需要面向全球提供产品和服务的企业来说,跨地域网络的质量和安全性是普遍存在的需求.许多使用传统网络加速解决方案的游戏公司和跨国公司,在运营过程中逐渐发现,丢包.抖动和高延迟等网络问题时常显现,网络卡 ...

  2. 工信部叫停苹果 Callkit,微信不能直接接听视频了

    开发四年只会写业务代码,分布式高并发都不会还做程序员? >>>   苹果有 ARkit.Classkit.Homekit 和 Sirikit 等开发工具,但 Callkit 却并不被 ...

  3. 安卓callkit_苹果Callkit国内被叫停:无需解锁即可接听网络电话 曾在微信短暂“现身”...

    (图片来源于网络) 苹果有 ARkit.Classkit.Homekit 和 Sirikit 等实用的开发工具,但其中一款却没那么有名气,这款工具名叫Callkit. 简单来说,这是一款能够将微信等网 ...

  4. p2p网络测试工具_自媒体 IPFS官方升级DHT方案,提升网络整体性能

    IPFS官方升级DHT方案,提升网络整体性能 4 月底,官方发布了迄今为止最大的 go-ipfs 更新:IPFS 0.5.0.此升级为 IPFS 带来了主要的性能和可靠性改进,尤其是在内容发现和路由方 ...

  5. 【深度学习】利用深度可分离卷积减小计算量及提升网络性能

    [深度学习]利用深度可分离卷积减小计算量及提升网络性能 文章目录 1 深度可分离卷积 2 一个深度可分离卷积层的代码示例(keras) 3 优势与创新3.1 Depthwise 过程3.2 Point ...

  6. 网络营销外包期间如何提升网络营销外包外链优化效果?

    在网络营销推广过程中,网站外链建设的作用不言而喻,不仅可以从多方面为网站提升曝光度,还能促进搜索引擎蜘蛛爬虫对网站内容迅速抓取,那么在网络营销外包期间是如何做好网站外链建设优化的呢?下面就针对该问题进 ...

  7. 卷积核一定可以提升网络性能吗?-分类0,2

    制作一个网络然后向这个网络上加1-9个卷积核,通过网络的分辨准确率来比较卷积核对网络性能的影响. 网络的结构是 (mnist 0 ,mnist2)81-con(3*3)*n-(49*n)-30-2-( ...

  8. mac苹果ping不通网络

    新买了mac,在安装synergy的时候,我拿我的win当server,mac当client,随后发现,synergy提示连接不到server,ping host 失败, cannot connect ...

  9. 又崩了?苹果发生大规模网络故障:多项服务受影响 目前已恢复

    3月22日消息,针对原神部分用户充值异常的问题,原神官微今日发文称,由于Apple服务异常,部分旅行者出现了游戏充值异常的问题.现在相关服务已恢复. 周一下午晚些时候,苹果发生大规模网络故障,苹果iC ...

最新文章

  1. Datawhale组队学习周报(第018周)
  2. 风云编程python-python网络编程(一)
  3. javaweb学习总结(二十二):基于Servlet+JSP+JavaBean开发模式的用户登录注册
  4. gcc的警告提示信息
  5. 洛谷 P1330 封锁阳光大学题解
  6. Discuz!NT 缓存设计简析
  7. 三元一次方程组步骤_姜红梅名师工作室【教学感悟】三元一次方程组解法的思考...
  8. 通信工程师考试基本情况及经验分享
  9. 通达OA二次开发手册V12
  10. 【论文翻译】从零开始PointNet论文分析与代码复现
  11. 将优盘的FAT32格式改为NTFS
  12. 计算机乱七八糟小知识备忘录
  13. ThreadPoolExecutor中addWorker,continue retry和break retry是什么意思
  14. Java面向对象原谅帽
  15. java 微秒 时间_Java中时间的计算 年月日小时分钟秒毫秒微秒
  16. Linux基础(2)/Linux 基本概念及操作
  17. Excel成绩表打印
  18. 小米4电信4G_2014726_官方线刷包_救砖包_解账户锁
  19. SCAU 1028 求素数
  20. Linux系统性能监控分析工具perf

热门文章

  1. 蓝桥杯最大最小公倍数
  2. Image Overlap到手写数字识别
  3. 自动化渗透测试工具开发实践
  4. python读取文件类型_Python使用filetype精确判断文件类型 (文件类型获取)
  5. 苹果手机定位在哪里设置?定位如何打开?
  6. 抢注过期域名的几大注意事项
  7. java set clear_Java StringBuilder 清空Clear方法
  8. 【DG】DG备库报ORA-28000: the account is locked的解决办法
  9. 记录markdown数学公式与符号
  10. Android事件分发机制收藏这一篇就够了,从入门到深入