跳到主要内容

推送管理

iOS 推送配置概述

  • 应用需要提交国内苹果商店审核

    该场景下无法使用苹果 CallKit。请直接使用融云官网或 CocoaPods 上提供的融云 SDK,并保证控制台的 VoIP 设置VoIP 推送转 APNs 推送 为开启状态。具体请查看解决方案

  • 应用不需要提交国内苹果商店审核

    请通过工单向融云索取实现了苹果 CallKit 框架的 RongCallKit 源码,替换工程中使用的 RongCallKit.framework 库文件或开源代码,并将控制台的 VoIP 设置VoIP 推送转 APNs 推送 设置为关闭状态。具体请查看 VoIP 推送

什么是苹果 CallKit

苹果 CallKit 开发框架最早在 iOS 10 上发布,它支持 VoIP 应用将通话功能集成到 iPhone 自带的通话功能中,简言之,就是让用户收到来自第三方应用的语音、视频聊天时直接看到和普通来电或 Facetime 来电相同的界面,是非常友好的用户体验。

在中国 App Store 发布的应用不能使用 CallKit 功能

大约在 2018 年 5 月左右,苹果要求在中国区应用商店(App Store)发布的应用停止使用 CallKit 功能。包含 CallKit 功能的应用在提交审核时会被拒绝,拒绝的理由如下邮件信息所示是由于工信部的要求。在此要求之后,包括微信、钉钉等包含音视频通信的应用都在 iOS 应用中取消了 CallKit 功能。

Email from Apple

Dear Developer,

The Chinese Ministry of Industry and Information Technology (MIIT) http://www.miit.gov.cn/n1146285/ ... n3057713/index.html requested that CallKit functionality be deactivated in all apps available on the China App Store.

Since your app currently includes CallKit and is available for sale on the China App Store, you will need to submit an update that removes CallKit functionality in China.

VOIP call functionality continues to be allowed but can no longer take advantage of CallKit ’ s intuitive look and feel. CallKit can continue to be used in apps outside of China.

If you have questions or do not believe your app is subject to this update, please contact MIIT.

Best regards,

App Store Review

禁用苹果的 CallKit 之后,在中国 App Store 上架的第三方应用不再能够实现和普通来电或 Facetime 来电相同的用户体验。当用户被呼叫时,只能够通过推送消息的方式提醒用户。同时,融云在 Github 开源的 RongCallKit 源码和发布的 RongCallKit 库文件中默认已不包含苹果的 CallKit 框架,以免造成在国内提交苹果商店审核时被拒绝的情况。

解决方案

对于国内需要提交苹果商店审核的 App,融云使用 APNs 普通推送替代 VoIP 推送的方式接收音视频呼叫。请在控制台的 VoIP 设置 中开启 VoIP 推送转 APNs 推送,该选项默认为开启,即:使用 APNs 普通推送。

关于配置 APNs 远程推送请参阅 IM 推送配置

使用 APNs 普通推送后的影响:

  • APNs 远程推送 (普通消息推送) 表现为手机屏幕上弹窗以及文字提示,声音一般为系统铃声,该推送完全由系统处理,App 无法激活以及处理任何程序。铃声可以由 App 进行设置,时间长度最长为 30 秒(苹果官方文档)。
  • 震动效果只震动一下,与收到普通消息的震动效果相同。如果要实现长时间的震动,需要在 App 层实现 Notification Service Extension,且需要与非音视频的普通推送区分开,否则类似文字消息的推送也会变成长震动。请参考示例 Demo: (链接) ,此 Demo 仅实现了普通推送的长震动效果。
  • 收到 APNs 普通推送时无法激活 App,点击通知条后 App 才能启动。在启动完成及 IM 建立连接成功后 RongCallKit 自动弹出音视频来电接听界面。
  • 在手机设置的通知中,需要开启 APP 的通知,手机屏幕解锁时提醒的横幅选项需要勾选,并且横幅的风格修改为持续,否则通知条会在弹出几秒后自动缩回,来电铃声会被终止,此为 iOS 系统行为,融云 SDK 无法控制。

非中国 App Store 发布的应用可使用苹果 CallKit 功能

如果您的 App 不需要提交中国区 App Store 审核,您可以放心使用苹果的 CallKit 框架,可正常使用 VoIP 推送功能。您可以通过工单向融云索取包含苹果 CallKit 框架实现的 RongCallKit 库的开源源码。

VoIP 推送

相较于常规的 APNs 推送,VoIP 推送(VoIP Push Notification)是在 iOS 8 之后推出的,需要依赖 PushKit.framework。类似于 APNs,VoIP 推送也能在应用处于被杀死状态下唤醒 App。

从 iOS13 开始,苹果基于安全考虑在使用 VoIP 推送时必须配合苹果 CallKit.framework 使用,否则 iOS 系统将在收到 VoIP 推送后杀掉 App 进程,就像没有收到一样(苹果官方文档)。

VoIP 推送需要使用到 PushKit 框架从苹果获取 VoIP Token,该框架在 CallLib 中已实现,但默认处于未开启状态。您需要手动开启。

申请 VoIP 证书

  1. 在苹果开发者后台 Certificates,Identifiers & Profiles 中,左侧选择 Certificates,点击加号(+)新建证书:

    (height=250)

  2. 选择证书种类 VoIP Services Certificate,点击 Continue

    (height=300)

  3. 绑定生成证书的 App ID(一般是 BundleID),点击 Continue

    (height=200)

  4. 此时系统会提示需要一个 Certificate Signing Request(CSR),请打开钥匙串访问 > 证书助理

    (height=300)

  5. 在证书助理中填写邮箱,并选择存储到磁盘

    (height=300)

  6. 选择刚才生成的 CSR,点击 Continue 生成 VoIP 证书:

    (height=200)

  7. 下载打开,并从钥匙串中导出 .p12 格式的证书备用:

    (height=350)

上传 VoIP 证书

  1. 前往融云开发者平台的 IM 服务 页面,在页面顶部确认已切换到需要配置的 App。

  2. 依次点击 应用标识 > 设置推送,选择生产环境,上传刚才导出的 .p12 证书。

    (height=400)

  3. 在融云开发者平台,找到音视频服务 > VoIP 设置,保持关闭状态。

    (height=150)

设置 provisioning profile

  • 在 Xcode 中设置 provisioning profile。因为苹果的 VoIP Push 只提供生产环境的证书,所以只有在生产环境才可以使用 VoIP 推送。
  • 所以您在打包的时候,需要设置 provisioning profiledistribution 才能收到 VoIP 推送。 关于 Xcode 如果设置 provisioning profile 的更多内容,可以参考 Xcode 官方文档

客户端配置

开启 VoIP

  • 当您基于 RongCallKit 进行开发时,则必须使用从融云索取的 RongCallKit 开源源码替换掉工程中的 RongCallKit Framework 文件或开源代码。

    关于如何以源码集成 CallKit,请参见导入 SDK

    替换后,请在 RCCXCall.h 文件中将 PUBLIC 宏定义修改为 0

    #import <Foundation/Foundation.h>

    /// 默认不开启 系统 Callkit 功能
    #define PUBLIC 0

    /*!
    融云适配苹果 CallKit 核心类
    */
    @interface RCCXCall : NSObject
    ...
    @end
  • 当您基于 RongCallLib 库进行的开发时,请在该库的 RCCallClient 类中使用单例打开 - (void)setApplePushKitEnable:(BOOL)enable 设置,用来从苹果获取 VoIP Token。因为 RongIMLib 在初始化时就会上传 VoIP TokenServer,建议在 AppDelegate.m- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 中进行设置。

    在 RCCallClient.h 调用以下 API。

    /*!
    设置是否使用苹果 PushKit 推送

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

    @remarks 通话设置
    */
    - (void)setApplePushKitEnable:(BOOL)enable;

设置 Background Modes

在工程设置中,依次选择 Capabilities > Background Modes

  • Xcode 9 之前勾选上 Voice over IPRemote Notifications

    (height=300)

  • Xcode 9 之后需要在 info.plist 中设置如图:

按上述文档集成完毕之后,需要在生产环境测试 VoIP 推送是否集成成功。

生产环境测试

  1. 模拟器收不到 VoIP 推送。
  2. 越狱的设备可能收不到 VoIP 推送。
  3. 使用通配符 BundleID 的 App 将无法使用 VoIP 推送。
  • 方案一:

    如果 App 是 App-Store 类型的,但是还没有在 App Store 上架,在上架之前如果想使用生产环境测试远程推送,需要生成一个 Ad-Hoc 的 Provisioning Profile ,并在 Xcode 中使用其进行打包,导出为 Ad Hoc Deployment。参考 Xcode 官方文档

  • 方案二:

    开发者可使用 TestFlight 模式进行测试。参考 Xcode 官方文档

备注

VoIP 推送必须使用苹果 CallKit 框架的限制是从 iOS13 开始的。如果您使用 Xcode10,也就是 iOS 12 编译 App,仍可以在不使用苹果 CallKit 框架下使用 VoIP 推送,并通过苹果商店审核。但 苹果官网在 2020 年 3 月 26 日的新闻 中公布,使用 Xcode10 编译 App 提交苹果商店的截止日期为 2020 年 6 月 30 日,即从 2020 年 7 月起必须使用 Xcode11 编译 App,否则无法通过苹果商店审核,这样就阻断了 Xcode10 编译 App 使用 VoIP 推送的办法。