Je viens de passer de Xcode 7 au 8 GM et au milieu des problèmes de compatibilité Swift 3, j'ai remarqué que mes jetons d'appareil avaient cessé de fonctionner. Ils ne lisent plus que «32 octets».
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)
{
print(deviceToken) // Prints '32BYTES'
print(String(data: deviceToken , encoding: .utf8)) // Prints nil
}
Avant la mise à jour, je pouvais simplement envoyer les NSData à mon serveur, mais maintenant j'ai du mal à analyser le jeton.
Qu'est-ce que j'oublie ici?
Edit: Je viens de tester la conversion vers NSData et je vois les résultats attendus. Alors maintenant, je suis juste confus au sujet du 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
}
NSData
simplement imprimer ledescription
duNSData
. Vous n'obtenez toujours pas une chaîne de cela.Réponses:
la source
%02x
ça va aussi.%02.2hhx
et%02x
nshipster.com/apns-device-tokens/#overturned-in-ios-13J'ai eu le même problème. Voici ma solution:
la source
NSData
dans une chaîne. J'ai suggéré d'utiliser l'encodage base64 dans ma réponse. Cela utilise l'encodage base16.Voici mon extension Swift 3 pour obtenir une chaîne hexadécimale encodée en base 16:
la source
Le jeton d'appareil n'a jamais été une chaîne et certainement pas une chaîne encodée en UTF-8. Ce sont des données. C'est 32 octets de données opaques.
Le seul moyen valide de convertir les données opaques en une chaîne est de les encoder - généralement via un encodage base64.
Dans Swift 3 / iOS 10, utilisez simplement la
Data base64EncodedString(options:)
méthode.la source
NSData
ouData
peu importe. Les octets des données ne sont pas et n'ont jamais été une chaîne. La documentation indique clairement qu'il s'agit d'un ensemble opaque de données. Le fait que votre code fonctionnait est la chance. C'était toujours la mauvaise façon de gérer cela. Convertissez simplement les données en chaîne en encodant les données en base64. C'est la bonne solution maintenant et avant.Essaye ça:
la source
essaye ça
la source
Le moyen le meilleur et le plus simple.
la source
Celui-ci n'a pas été déclaré comme une réponse officielle (je l'ai vu dans un commentaire), mais c'est ce que j'ai finalement fait pour remettre mon jeton en ordre.
la source
as NSData
là. lorsque vous mettez NSData pas de données, la valeur retournera même sur iOS 10la source
Je viens de faire ça
il a donné le même résultat que,
la source
Obtenez un jeton d'appareil au format approprié.
la source