94 votes

Swift 3 - les jetons d'appareil sont maintenant analysés comme "32BYTES"

Je viens de mettre à jour de Xcode 7 au 8 GM et au milieu de la Swift 3 problèmes de compatibilité, j'ai remarqué que mon appareil jetons ont cessé de travailler. Maintenant ils seulement lu '32BYTES'.

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

Avant la mise à jour j'ai été en mesure de simplement envoyer de l'NSData à mon serveur, mais maintenant, je vais avoir un moment difficile en fait de l'analyse du jeton.

Ce qui me manque ici?

Edit: je viens de tester la conversion de retour à NSData et je vois les résultats attendus. Alors maintenant, je suis juste confus sur le nouveau type de Données.

    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
}

193voto

Rok Gregorič Points 1874
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
    print(token)
}

35voto

Oleg Points 451

J'ai eu le même problème. Ceci est ma solution:

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

29voto

phatmann Points 4153

Voici mon extension Swift 3 pour obtenir une chaîne hexadécimale encodée en base 16:

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

27voto

rmaddy Points 79279

Le jeton de périphérique n'a jamais été une chaîne et certainement pas une chaîne codée UTF-8. C'est des données. C'est 32 octets de données opaques.

Le seul moyen valable de convertir les données opaques en chaîne est de les coder, généralement par le biais d'un codage base64.

Dans Swift 3 / iOS 10, utilisez simplement la méthode Data base64EncodedString(options:) .

15voto

user Points 578

Essaye ça:

 func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {

   let token = String(data: deviceToken.base64EncodedData(), encoding: .utf8)?.trimmingCharacters(in: CharacterSet.whitespaces).trimmingCharacters(in: CharacterSet(charactersIn: "<>")) 
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X