iOS13 VoIP 推送收不到的处理办法

已邀请:

用户升级 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 注册推送:

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

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

实现 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


要回复问题请先登录注册