我构建了我的应用程序,并在didRegisterForRemoteNotificationsWithDeviceToken
中设置了断点,但它没有被触发。
在其他版本的iOS上运行良好。
这是iOS 13的一个bug还是我错过了iOS 13的一些新内容?
我使用的是Xcode Beta 6和iOS 13 beta 8。
通过重新连接WiFi或在WiFi和蜂窝数据之间切换也可以解决上述问题。
此外,iOS 13的更改会影响推送通知的实现。
iOS 13之前,许多人都这样做。
(deviceToken as NSData).description
// Used to return as follows
"<965b251c 6cb1926d e3cb366f dfb16ddd e6b9086a 8a3cac9e 5f857679 376eab7C>"
let tokenData = deviceToken as NSData
let token = tokenData.description
let token = "\(deviceToken)".replacingOccurrences(of: " ", with: "")
.replacingOccurrences(of: "<", with: "")
.replacingOccurrences(of: ">", with: "")
在iOS 13中,苹果更改了NSData类的description方法的实现方式。因此,它返回:"{length = 32, bytes = 0x965b251c 6cb1926d e3cb366f dfb16ddd ... 5f857679 376eab7c }" // in iOS 13.
这最终导致许多应用程序的推送通知功能出现故障。
从现在开始,如果您需要将推送通知注册设备令牌转换为Base16编码/十六进制字符串表示形式,则应按以下方式操作Swift语言。
let deviceTokenString = deviceToken.map { String(format: "%02x", $0)
}.joined()
对于Objective C,请使用以下代码
- (NSString *)hexadecimalStringFromData:(NSData *)deviceToken {
NSUInteger dataLength = deviceToken.length;
if (dataLength == 0) {
return nil;
}
const unsigned char *dataBuffer = (const unsigned char *)deviceToken.bytes;
NSMutableString *hexString = [NSMutableString stringWithCapacity:(dataLength * 2)];
for (NSInteger index = 0; index < dataLength; ++index) {
[hexString appendFormat:@"%02x", dataBuffer[index]];
}
return [hexString copy];
}
我发现了一篇关于特定主题的全面文章https://nshipster.com/apns-device-tokens/
didRegisterForRemoteNotificationsWithDeviceToken
没有触发,请尝试以下方法。我尝试了很多方法来解决我的wifi网络问题,但是都没有成功。所以我将网络切换到蜂窝数据,didRegisterForRemoteNotificationsWithDeviceToken
又开始触发了。
didRegisterForRemoteNotificationsWithDeviceToken
的实现添加到问题中呢?如果我们看不到您的代码,很难说出问题所在。 - Eugene Berdnikov