跳转至

实时音视频推送

使用和设置实时音视频推送之前,必须设置和开启普通消息的远程推送。

如果使用了融云通话 SDK( CallKitCallLib),则需要开启实时音视频推送功能并上传 VoIP 推送证书。

开通服务

首先,您需要在 Apple Developer 为您的 App 开启远程推送服务。 具体步骤可以参考文档

生成证书

点击 Certificates -> All ,在 iOS Certificates 界面,点击右上角的加号。

image

选择 Production -> VoIP Services Certificate,点击 Continue

image

选择您应用对应的 App ID,点击 Continue

image

点击 Create Certificate,这时候会提示您需要一个 Certificate Signing Request(CSR)

image

根据其说明,在 Mac 上打开钥匙串应用,在菜单中点击“从证书颁发机构请求证书”。

image

输入您的邮箱、姓名或公司名,选择保存到磁盘,点击继续,就会生成一个 *.certSigningRequest 文件。

image

然后返回 Apple Developer 网站,点击 Continue,上传生成的 .certSigningRequest 文件,点击 Generate,即可生成推送证书。

image

将上面的 SSL Certificate 都下载到 Mac 本地,双击打开,系统会将其导入钥匙串中。 打开钥匙串应用,选中对应的证书,右键选择导出。保存 P12 文件时,可以为其设置密码,也可以让密码为空。

image

image

上传证书

在融云开发者平台 App -> IM 服务 -> 应用标识 路径下,选择生产环境,上传刚才导出的 P12 证书。

image

注意

苹果规定只有生产环境才能使用 VoIP 推送,所以开发环境无法使用 VoIP 推送。

设置 provisioning profile

Xcode 中设置 provisioning profile

因为苹果的 VoIP Push 只提供生产环境的证书,所以只有在生产环境才可以使用 VoIP 推送。

所以您在打包的时候,需要设置 provisioning profiledistribution 才能收到 VoIP 推送。 关于 Xcode 如果设置 provisioning profile的更多内容,可以参考文档。

开启后台 VoIP 通话设置

在工程设置中 Capabilities -> Background Modes ,Xcode 9 之前勾选上 Voice over IPRemote Notifications

image

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

image

注意

因为收到 VoIP 推送之后,App 在后台会被系统短暂唤醒。 为了正常处理通话相关逻辑,需要在 AppDelegate- application:didFinishLaunchingWithOptions: 方法中需要初始化融云 SDK 并连接服务器。

iOS13 收不到推送解决方案

用户升级 iOS 13 后,会出现 VoIP 推送收不到的现象。这主要是因为旧版本中获取 NString 类型 Token 方式如下:

NSString *voipToken = [[[[credentials.token description]
                                stringByReplacingOccurrencesOfString:@"<" withString:@""]
                                stringByReplacingOccurrencesOfString:@">" withString:@""]
                                stringByReplacingOccurrencesOfString:@" " withString:@""];

上面的代码之所以这样写是因为在 iOS 12 中 [credentials.token description] 的返回结果如下:

<57dea612fc94cd10304672d0ced5d5f2d8495b9da4d99110f99086a7b1b96c3>

而在 iOS 13 中 [credentials.token description] 的结果是:

{length=32, bytes = 0x57dea612fc94cd10304672d0ced5d...... 10f99086a7b1b96c3}

这就是推送收不到的原因,在 iOS 13 中通过调用 description 无法获取到正确的 Token。

基于上述原因,融云提供如下解决方案,开发者需要集成融云 CallLib、CallKit 2.10.1 版本 SDK。

注:针对集成 CallLib、CallKit 2.8.32 或 2.9.0 ~ 2.9.12 旧版本音视频引擎的 SDK,适配方式请参考文档

  1. 针对在国内应用市场上架的应用:

    因苹果系统 CallKit 无法在国内应用市场上架,iOS 13 上使用 VoIP 推送必须依赖苹果系统 CallKit,所以在 iOS 13 系统上,如需要接收音视频推送,需要开通 VoIP 推送转 APNs 推送功能,可通过提交工单方式申请开通,音视频呼叫请求将通过 APNs Push 进行推送。

  2. 针对在海外应用市场上架的应用,如果需要使用苹果 CallKit 系统 UI,可以使用下面方法:

    调用 RCCallClient 的下面方法,打开苹果 PushKit 推送,也就是 VoIP 推送,同时导入苹果系统 CallKit,实现 VoIP 推送回调的代理方法。另外融云已经在 RongCallKit 中适配了苹果系统 CallKit 的 UI,公有云暂时没有开放该功能,开发者可以通过提交工单的方式向融云申请 SDK

// 打开 VoIP 推送功能

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


// 以下为 RCCallClient 的代理回调方法,如果不使用 RongCallKit 可以自行实现苹果 CallKit 相关 UI

/*!
接收到通话呼入的远程通知的回调

@param callId        呼入通话的唯一值
@param inviterUserId 通话邀请者的UserId
@param mediaType     通话的媒体类型
@param userIdList    被邀请者的UserId列表
@param userDict      远程推送包含的其他扩展信息
@param isVoIPPush 是否 VoIP 推送
*/
- (void)didReceiveCallRemoteNotification:(NSString *)callId
                           inviterUserId:(NSString *)inviterUserId
                               mediaType:(RCCallMediaType)mediaType
                              userIdList:(NSArray *)userIdList
                                userDict:(NSDictionary *)userDict
                              isVoIPPush:(BOOL)isVoIPPush;

3、使用 Category 声明私有方法

@interface RCIMClient (Private)

- (void)setVoIPDeviceToken:(NSString *)voipDeviceToken;

@end