iOS13 以上 VoIP 功能适配

升级到 iOS 13 和 Xcode 11 之后,无法收到 VoIP 推送,PushKit 功能表现异常
发布时间: 2019-11-21 16:35

回答:

iOS13 VoIP 推送问题说明

问题

APNS 远程推送:指由苹果服务器发送的推送消息,带文字提示和语音提示,无法唤起 App
VoIP 远程推送:由苹果服务器发起,没有任和文字和铃声的展示,可以唤起 App 执行程序
本地推送:指由 App 自动调用系统 API 的方式发起的推送,UI 展示方式和 APNS 远程推送完全一样,需要 App 运行的过程中才能发起本地推送

下面分两种情况说明

  • App 在后台或者前台运行,IM 连接未断开

这种状态体验和原来一致,直接使用 IM 消息作为信令激活音视频来电功能

  • App 连接断开或者被系统杀掉

这种情况下 App 不活跃,无法执行任何程序,需要由推送唤醒 App 才能进行音视频相关逻辑处理,苹果推送分为两种:

1. APNS 远程推送 (普通消息推送) 表现为手机屏幕上弹窗以及文字提示,声音一般为系统铃声,该推送完全由系统处理,App 无法激活以及处理任何程序,铃声可以由 App 进行设置,时间长度最长为 30 秒 苹果官方文档

2. VoIP 推送 (PushKit 推送) 该推送没有任和提示,也没有弹窗和文字提示,只是将 App 唤起,App 可以执行代码。iOS 13 之前收到 VoIP 推送时由于苹果不强制 App 使用苹果 CallKit 系统库,App 激活后内部自动连接 IM,收到 IM 消息后通过本地推送的方式播放 App 内置铃声以及推送提示,用户点击后自动进入音视频接听界面。从 iOS13 开始苹果为防止 VoIP 推送被非来电功能滥用,禁止在非来电功能中使用 VoIP 推送,如果使用 VoIP 推送只能使用 iOS 系统的 CallKit.framework 库,如果不使用 iOS 系统的 CallKit.framework 库,App 在收到 VoIP 推送后会被杀掉,表现上就类似于没有收到 VoIP 推送

兼容性处理

由于苹果限制中国区域使用 iOS 系统的 CallKit.framework 库,导致 VoIP 推送功能也无法在苹果商店审核通过,所以将原有 VoIP 推送方案改为使用 APNS 远程推送的方式接收音视频信令。

相同点: 铃声和文字提示效果相同,点击通知条或者启动 App 时直接进入音视频来电接听界面

不同点: 受 APNS 推送限制铃声最长为30秒,且震动效果只震动一下,与其他收到普通消息的震动效果相同。持续震动效果经过验证后无法通过 NotificationExtension 相关逻辑来实现,因为在 NotificationExtension 中无权限调用 iOS 系统的振动。点击接听后能看到 App 启动过程,能看到启动图和 IM 的连接过程,IM 连接成功后自动进入音视频来电接听界面

融云解决办法

1. 目前中国区域:可以通过融云工单提交申请并确认开通 VoIP 转 APNS 服务解决该问题,开通之后功能表现如上所述

2. 针对国外上线的 App:融云已适配苹果 CallKit.framework,如果需要适配苹果 CallKit.framework 相关代码可以通过提工单的方式索要。使用时需要调用

/*!
 是否打开苹果 PushKit 推送,该推送可以直接激活 App,注:iOS 13 以后 PushKit 必须结合苹果 CallKit.framework 进行使用,否则无法正常处理 VoIP 相关推送逻辑,如果设置为 NO 则使用普通 APNS 消息推送来处理音视频信令逻辑,默认关闭。打开之后 App 默认需要自行处理 VoIP 推送唤起 CallKit.framework 的逻辑。
 */
- (void)setApplePushKitEnable:(BOOL)enable;

另外

以当前的条件限制,如果您可以做到使用 Xcode11 编译 App 且不提交中国区域苹果商店审核,在工程中添加了 CallKit.framework 库之后就还可以在 iOS13 中运行 VoIP 推送功能.

从2020年4月起提交苹果商店的 App 都要求使用 Xcode11 也就是 iOS13 编译, 那么使用 Xcode10 也就是 iOS12 编译 App 的方式也就无法使用 VoIP 推送功能.