海外 VoIP 以及 CallKit 的说明
什么是 VoIP 推送
相较于常规的 APNs 推送,VoIP 推送(VoIP Push Notification)是在 iOS 8 之后推出的,需要依赖 PushKit.framework。类似于 APNs,VoIP 推送也能在应用处于被杀死状态下唤醒 App。
从 iOS13 开始,苹果基于安全考虑在使用 VoIP 推送时必须配合苹果 CallKit.framework 使用,否则 iOS 系统将在收到 VoIP 推送后杀掉 App 进程,就像没有收到一样(苹果官方文档)。
VoIP 推送需要使用到 PushKit 框架从苹果获取 VoIP Token,该框架在 CallPlusLib 中已实现,但默认处于未开启状态。您需要手动开启。
CallKit 国内使用的限制
苹果 CallKit 开发框架最早在 iOS 10 上发布,它支持 VoIP 应用将通话功能集成到 iPhone 自带的通话功能中,简言之,就是让用户收到来自第三方应用的语音、视频聊天时直接看到和普通来电或 Facetime 来电相同的界面,是非常友好的用户体验。
大约在 2018 年 5 月左右,苹果要求在中国区应用商店(App Store)发布的应用停止使用 CallKit 功能。包含 CallKit 功能的应用在提交审核时会被拒绝,拒绝的理由如下邮件信息所示是由于工信部的要求。在此要求之后,包括微信、钉钉等包含音视频通信的应用都在 iOS 应用中取消了 CallKit 功能。 禁用苹果的 CallKit 之后,在中国 App Store 上架的第三方应用不再能够实现和普通来电或 Facetime 来电相同的用户体验。
非中国 App Store 发布的应用可使用苹果 CallKit 功能
如果您的 App 不需要提交中国区 App Store 审核,您可以放心使用苹果的 CallKit 框架,可正常使用 VoIP 推送功能。
VoIP 推送配置
VoIP 推送证书配置
申请 VoIP 证书
1.在苹果控制台 Certificates,Identifiers & Profiles 中,左侧选择 Certificates,点击加号(+)新建证书:
2.选择证书种类 VoIP Services Certificate,点击 Continue:
3.绑定生成证书的 App ID(一般是 BundleID),点击 Continue:
4.此时系统会提示需要一个 Certificate Signing Request(CSR),请打开钥匙串访问 > 证书助理:
5.在证书助理中填写邮箱,并选择存储到磁盘:
6.选择刚才生成的 CSR,点击 Continue 生成 VoIP 证书。
7.下载打开,并从钥匙串中导出 .p12 格式的证书备用。
上传 VoIP 证书
1.前往融云开发者平台的 IM 服务 页面,在页面顶部确认已切换到需要配置的 App。依次点击 应用标识 > 设置推送,选择生产环境,上传刚才导出的 .p12 证书:
2.在融云开发者平台,找到音视频服务 > VoIP 设置,保持关闭状态。
设置 provisioning profile
在 Xcode 中设置 provisioning profile。因为苹果的 VoIP Push 只提供生产环境的证书,所以只有在生产环境才可以使用 VoIP 推送。 所以您在打包的时候,需要设置 provisioning profile 为 distribution 才能收到 VoIP 推送。 关于 Xcode 如果设置 provisioning profile 的更多内容,可以参考 Xcode 官方文档。
客户端配置
开启 VoIP 功能
调用 ‘setVoipPushKitEnable:’ 接口开启远程 VoIP 推送功能,SDK 内部会自动设置 PushKit 推送代理。
[[RCCallPlusClient sharedInstance] setVoipPushKitEnable:YES];
设置 Background Modes
在工程设置中,依次选择 Capabilities > Background Modes。Xcode 9 之前勾选上 Voice over IP 和 Remote Notifications。
Xcode 9 之后需要在 info.plist 中设置如下图。
按上述文档集成完毕之后,需要在生产环境测试 VoIP 推送是否集成成功。
生产环境测试
注意
模拟器收不到 VoIP 推送。 越狱的设备可能收不到 VoIP 推送。 使用通配符 BundleID 的 App 将无法使用 VoIP 推送。
-
方案一: 如果 App 是 App-Store 类型的,但是还没有在 App Store 上架,在上架之前如果想使用生产环境测试远程推送,需要生成一个 Ad-Hoc 的 Provisioning Profile ,并在 Xcode 中使用其进行打包,导出为 Ad Hoc Deployment。参考 Xcode 官方文档。
-
方案二: 开发者可使用 TestFlight 模式进行测试。参考Xcode 官方文档。