Właśnie zaktualizowałem Xcode 7 do 8 GM i pośród problemów ze zgodnością Swift 3 zauważyłem, że moje tokeny urządzenia przestały działać. Teraz czytają tylko „32 bajty”.
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)
{
print(deviceToken) // Prints '32BYTES'
print(String(data: deviceToken , encoding: .utf8)) // Prints nil
}
Przed aktualizacją mogłem po prostu wysłać NSData na mój serwer, ale teraz mam problem z analizowaniem tokena.
Czego tu brakuje?
Edycja: właśnie testuję konwersję z powrotem do NSData i widzę oczekiwane wyniki. Więc teraz jestem po prostu zdezorientowany nowym typem danych.
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
po prostu drukujedescription
zNSData
. Nadal nie otrzymujesz z tego ciągu.Odpowiedzi:
źródło
%02x
też jest w porządku.%02.2hhx
i%02x
nshipster.com/apns-device-tokens/#overturned-in-ios-13Miałem ten sam problem. To jest moje rozwiązanie:
źródło
NSData
ciągu. Zasugerowałem użycie kodowania base64 w mojej odpowiedzi. Używa kodowania base16.Oto moje rozszerzenie Swift 3, aby uzyskać ciąg szesnastkowy zakodowany w base-16:
źródło
Token urządzenia nigdy nie był łańcuchem i na pewno nie był łańcuchem zakodowanym w UTF-8. To dane. To 32 bajty nieprzezroczystych danych.
Jedynym prawidłowym sposobem konwersji nieprzezroczystych danych na ciąg jest zakodowanie ich - zwykle za pomocą kodowania base64.
W Swift 3 / iOS 10 po prostu użyj tej
Data base64EncodedString(options:)
metody.źródło
NSData
lubData
nie ma to znaczenia. Bajty danych nie są i nigdy nie były ciągiem. Dokumentacja jasno stwierdza, że jest to nieprzejrzysty zestaw danych. Fakt, że Twój kod działał, to szczęście. Zawsze był to niewłaściwy sposób radzenia sobie z tym. Po prostu przekonwertuj dane na ciąg przez kodowanie base64. To właściwe rozwiązanie teraz i wcześniej.Spróbuj tego:
źródło
Spróbuj tego
źródło
Najlepszy i najłatwiejszy sposób.
źródło
Ta odpowiedź nie została podana jako oficjalna odpowiedź (widziałem to w komentarzu), ale ostatecznie to zrobiłem, aby przywrócić porządek w moim tokenie.
źródło
as NSData
tam wstawić . jeśli wstawisz jako NSData not Data zwróci poprawną wartość nawet na iOS 10źródło
Właśnie to zrobiłem,
dał wynik taki sam jak
źródło
Uzyskaj token urządzenia o odpowiednim formacie.
źródło