Ich habe gerade von Xcode 7 auf 8 GM aktualisiert und inmitten der Swift 3-Kompatibilitätsprobleme festgestellt, dass meine Gerätetoken nicht mehr funktionieren. Sie lesen jetzt nur noch '32BYTES'.
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)
{
print(deviceToken) // Prints '32BYTES'
print(String(data: deviceToken , encoding: .utf8)) // Prints nil
}
Vor dem Update konnte ich die NSData einfach an meinen Server senden, aber jetzt fällt es mir schwer, das Token tatsächlich zu analysieren.
Was vermisse ich hier?
Bearbeiten: Ich teste gerade die Konvertierung zurück zu NSData und sehe die erwarteten Ergebnisse. Jetzt bin ich nur noch verwirrt über den neuen Datentyp.
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
}
NSData
einfach dasdescription
von zu druckenNSData
. Daraus ergibt sich immer noch kein String.Antworten:
quelle
%02x
ist auch okay.%02.2hhx
und%02x
nshipster.com/apns-device-tokens/#overturned-in-ios-13Ich hatte das gleiche Problem. Das ist meine Lösung:
quelle
NSData
in eine Zeichenfolge. Ich schlug vor, in meiner Antwort die Base64-Codierung zu verwenden. Dies verwendet die Base16-Codierung.Hier ist meine Swift 3-Erweiterung, um eine Base-16-codierte Hex-Zeichenfolge zu erhalten:
quelle
Das Geräte-Token war noch nie eine Zeichenfolge und schon gar nicht eine UTF-8-codierte Zeichenfolge. Es sind Daten. Es sind 32 Bytes undurchsichtiger Daten.
Die einzig gültige Möglichkeit, die undurchsichtigen Daten in eine Zeichenfolge zu konvertieren, besteht darin, sie zu codieren - normalerweise über eine Base64-Codierung.
Verwenden Sie in Swift 3 / iOS 10 einfach die
Data base64EncodedString(options:)
Methode.quelle
NSData
oderData
es spielt keine Rolle. Die Bytes der Daten sind keine Zeichenfolge und waren es auch nie. In der Dokumentation wird eindeutig angegeben, dass es sich um einen undurchsichtigen Datensatz handelt. Die Tatsache, dass Ihr Code früher funktioniert hat, ist Glück. Es war immer die falsche Art, damit umzugehen. Konvertieren Sie einfach die Daten in eine Zeichenfolge, indem base64 die Daten codiert. Das ist jetzt und früher die richtige Lösung.Versuche dies:
quelle
Versuche dies
quelle
Der beste und einfachste Weg.
quelle
Diese Antwort wurde nicht als offizielle Antwort angegeben (siehe in einem Kommentar), aber ich habe sie letztendlich getan, um mein Token wieder in Ordnung zu bringen.
quelle
as NSData
. Wenn Sie als NSData not Data angeben, wird der korrekte Wert auch unter iOS 10 zurückgegebenquelle
Ich habe das gerade gemacht,
es gab das gleiche Ergebnis wie,
quelle
Holen Sie sich das Gerätetoken mit dem richtigen Format.
quelle