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を送信するだけでしたが、トークンを実際に解析するのに苦労しています。
ここに何が欠けていますか?
編集:NSDataへの変換をテストしているだけで、期待どおりの結果が得られています。だから今、私はちょうど新しいデータ型について混乱しています。
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)
}
同じ問題がありました。これは私の解決策です:
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)
}
16進数でエンコードされた16進文字列を取得するためのSwift 3拡張機能は次のとおりです。
extension Data {
var hexString: String {
return map { String(format: "%02.2hhx", arguments: [$0]) }.joined()
}
}
デバイストークンは文字列ではなく、UTF-8でエンコードされた文字列ではありません。データです。 32バイトの不透明データです。
不透明なデータを文字列に変換する唯一の有効な方法は、それをエンコードすることです-通常は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)})
}
スイフト3
最良かつ最も簡単な方法。
deviceToken.base64EncodedString()
これは公式の回答としては述べられていませんでした(コメントで見ました)が、最終的にトークンを正常に戻すためにやったことです。
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)
}
私はちょうどこれをやった、
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)
}