问题
在 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