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) }