问题

在 iOS 13 环境下,由于苹果更改了基础框架的 API,导致旧版本的 Objc SDK(<= 11.6.6)无法通过文档中的下列方式上传有效的 device token:

// 二进制数据(device token)无法转化为正确的十六进制字符串
[installation setDeviceTokenFromData:deviceToken];
// 上传无效的十六进制字符串
[installation saveInBackground];

影响范围

iOS 13 将于 9 月 19 日发布。如果您的 Objc SDK 使用的是 11.6.6 及以下版本并按照上述方式上传 token,那么用户的设备升级到 iOS 13 后将无法收到推送。

解决方案

有如下三种方式:

方案 1

将 Objc SDK 升级到 11.6.7 或更高版本,并按如下方式上传 device token:

// 二进制数据(device token)转化为正确的十六进制字符串,
// 同时配置苹果开发者账号的 Team ID
[installation setDeviceTokenFromData:deviceToken teamId:@"Apple Developer Team ID"];
// 上传有效的十六进制字符串和 Team ID
[installation saveInBackground];

方案 2

旧版本的 Objc SDK(<= 11.6.6),可以按如下方式上传 device token:

Objc

NSUInteger dataLength = deviceToken.length;
if (dataLength > 0) {
    const unsigned char *dataBuffer = deviceToken.bytes;
    NSMutableString *hexString = [NSMutableString stringWithCapacity:(dataLength * 2)];
    for (int i = 0; i < dataLength; ++i) {
        [hexString appendFormat:@"%02.2hhx", dataBuffer[i]];
    }
    [installation setDeviceToken:[hexString copy]];
    [installation saveInBackground];
}

Swift

installation.deviceToken = deviceToken.map {
    String(format: "%02.2hhx", $0)
}.joined()
installation.saveInBackground()

方案 3

使用 Swift SDK 替换 Objc SDK

本主题已置顶,它将始终显示在它所属分类的顶部。可由职员对所有人解除置顶,或者由用户自己取消置顶。

本主题在创建 3 天后自动关闭。不再允许添加新回复。

本主题已被解除置顶,它将不再显示在它所属分类的顶部。