跳转至

推送设置

设置说明

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

如果使用了融云通话 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。

基于上述原因,融云提供如下修复方案:

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

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

注:开发者需要集成融云 CallLib、CallKit 2.10.1 版本 SDK,否则无法在国内市场上架。

2、针对在海外应用市场上架的应用,无需升级 SDK,只需要做以下设置即可:

1、注册推送

PKPushRegistry *pushRegistry = [[PKPushRegistry alloc] initWithQueue:dispatch_get_main_queue()];
pushRegistry.delegate = self;
pushRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];

注意:上面注册推送的代码一定要在 initWithAppKey: 方法之后,connectWithToken:success:error:tokenIncorrect: 之前执行

2、实现 delegate 方法

- (void)pushRegistry:(PKPushRegistry *)registry
    didUpdatePushCredentials:(PKPushCredentials *)credentials
                     forType:(NSString *)type {

    uint8_t* tokenBytes = (uint8_t*)credentials.token.bytes;
    NSMutableString* output = [NSMutableString stringWithCapacity:credentials.token.length * 2];
    for(int i = 0; i < credentials.token.length; i++) {  
        [output appendFormat:@"%02x", tokenBytes[i]];    
    }
    NSString* voipToken = [output copy];

    if (voipToken.length > 0) {
        [[RCIMClient sharedRCIMClient] setVoIPDeviceToken:voipToken];
    }
}

3、使用 Category 声明私有方法

@interface RCIMClient (Private)

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

@end