Swift3.1的DeviceToken打印的是32Bytes

問題描述】使用環(huán)境 Swift3.1Xcode8.3.3,項目代碼升級Swift3.1之后出現(xiàn)了DeviceToken 無法成功轉(zhuǎn) String 打印,打印出來的結(jié)果是 32Bytes。

解決方案

  • 方案一:由于 Data沒辦法從64位String轉(zhuǎn)成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 無法轉(zhuǎn)換成功,可利用 NSData 可轉(zhuǎn)成 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])];

}

參考文檔

stackoverflow論壇帖子

onevcat喵神

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容