Swift 3 – 设备令牌现在被parsing为'32BYTES'

我刚从Xcode 7更新到8 GM,在Swift 3兼容性问题中,我注意到我的设备令牌已经停止工作。 他们现在只读“32BYTES”。

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { print(deviceToken) // Prints '32BYTES' print(String(data: deviceToken , encoding: .utf8)) // Prints nil } 

在更新之前,我能够简单地将NSData发送到我的服务器,但现在我很难真正parsing令牌。

我在这里错过了什么?

编辑:我只是testing转换回NSData,我看到了预期的结果。 所以现在我只是对新的数据types感到困惑。

  func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { print(deviceToken) // Prints '32BYTES' print(String(data: deviceToken , encoding: .utf8)) // Prints nil let d = NSData(data: deviceToken) print(d) // Prints my device token } 
 func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined() print(token) } 

我有同样的问题。 这是我的解决scheme:

 func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { var token = "" for i in 0..<deviceToken.count { token = token + String(format: "%02.2hhx", arguments: [deviceToken[i]]) } print(token) } 

这里是我的Swift 3扩展,以获得一个基地16编码的hexstring:

 extension Data { var hexString: String { return map { String(format: "%02.2hhx", arguments: [$0]) }.joined() } } 

设备令牌从来不是一个string,当然也不是一个UTF-8编码的string。 这是数据。 这是32字节的不透明数据。

将不透明数据转换为string的唯一有效方法是对其进行编码 – 通常通过base64编码。

在Swift 3 / iOS 10中,只需使用Data base64EncodedString(options:)方法即可。

尝试这个:

 func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { let token = String(data: deviceToken.base64EncodedData(), encoding: .utf8)?.trimmingCharacters(in: CharacterSet.whitespaces).trimmingCharacters(in: CharacterSet(charactersIn: "<>")) } 

尝试这个

 if #available(iOS 10.0, *) { let deviceTokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)}) } 

这一个没有被正式的答复(在评论中看到),但是我最终做的是让我的令牌恢复正常。

 let tokenData = deviceToken as NSData let token = tokenData.description // remove any characters once you have token string if needed token = token.replacingOccurrences(of: " ", with: "") token = token.replacingOccurrences(of: "<", with: "" token = token.replacingOccurrences(of: ">", with: "") 
 func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { let token = deviceToken.map({ String(format: "%02.2hhx", $0)}).joined() print("TOKEN: " + token) } 

Swift 3

最好的和最简单的方法。

 deviceToken.base64EncodedString() 

我只是做了这个,

 let token = String(format:"%@",deviceToken as CVarArg).components(separatedBy: CharacterSet.alphanumerics.inverted).joined(separator: "") 

它给出了相同的结果,

 let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined() 

获取适当格式的设备令牌。

 func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { var formattedToken = "" for i in 0..<deviceToken.count { formattedToken = formattedToken + String(format: "%02.2hhx", arguments: [deviceToken[i]]) } print(formattedToken) }