Swift3.1 的 DeviceToken 打印的是 32Bytes

问题描述】使用环境 Swift3.1Xcode8.3.3,项目代码升级Swift3.1之后出现了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])];

}

参考文档

stackoverflow论坛帖子

onevcat喵神

© 著作权归作者所有
这个作品真棒,我要支持一下!
记录日常开发时所遇到的问题和解决方案,同时也会收藏一些学习时记录的笔记,随想以及翻译的博客等。 个人现在依然专注于...
0条评论
top Created with Sketch.