【問題描述】使用環(huán)境 Swift3.1 和 Xcode8.3.3,項目代碼升級Swift3.1之后出現(xiàn)了DeviceToken 無法成功轉 String 打印尔艇,打印出來的結果是 32Bytes空猜。
解決方案
- 方案一:由于 Data沒辦法從64位String轉成32位String Swift格式化打印遵岩,取低位吗货。
Swift3.1代碼:
//無需過濾字符 <, >, 空格
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
/*
//寫法一:
let tokenChars = UnsafePointer<CChar>(deviceToken.bytes)
var tokenString = ""
for i in 0..<deviceToken.length {
tokenString += String(format: "%02.2hhx", arguments: [tokenChars[i]])
}
*/
//寫法二:
let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
print(token)
}
Objective-C代碼:
const char *data = [deviceToken bytes];
NSMutableString *token = [NSMutableString string];
for (NSUInteger i = 0; i < [deviceToken length]; i++) {
[token appendFormat:@"%02.2hhX", data[i]];
}
- 方案二:由于 Data 無法轉換成功字逗,可利用 NSData 可轉成 NSString
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken {
const unsigned *tokenBytes = [deviceToken bytes];
NSString *hexToken = [NSString stringWithFormat:@"%08x%08x%08x%08x%08x%08x%08x%08x",
ntohl(tokenBytes[0]), ntohl(tokenBytes[1]), ntohl(tokenBytes[2]),
ntohl(tokenBytes[3]), ntohl(tokenBytes[4]), ntohl(tokenBytes[5]),
ntohl(tokenBytes[6]), ntohl(tokenBytes[7])];
}