web-dev-qa-db-fra.com

Swift 3 - les jetons de périphérique sont maintenant analysés comme "32BYTES"

Je viens de mettre à jour Xcode 7 vers le 8 GM et parmi les Swift 3 problèmes de compatibilité, j'ai constaté que mes jetons de périphérique ne fonctionnaient plus. Ils ne lisent plus que '32BYTES'.

    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 le NSData sur mon serveur, mais maintenant, j'ai du mal à analyser le jeton.

Qu'est-ce que j'oublie ici?

Edit: Je viens de tester la reconversion de NSData et je vois les résultats attendus. Alors maintenant, je suis juste dérouté par 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
}
92
user1537360
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
    print(token)
}
187
Rok Gregorič

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

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()
    }
}
29
phatmann

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 une chaîne consiste à 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:).

27
rmaddy

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: "<>")) 
}
15
user

essaye ça

if #available(iOS 10.0, *) {
   let deviceTokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})
}
8
bluenowhere

Swift 3

Le meilleur et le plus simple.

deviceToken.base64EncodedString()
7
Maselko

Celui-ci n'était pas indiqué comme une réponse officielle (vu dans un commentaire), mais c'est ce que j'ai finalement fait pour remettre mon jeton en ordre.

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: "")
4
Bill Burgess
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {

    let token = deviceToken.map({ String(format: "%02.2hhx", $0)}).joined()
     print("TOKEN: " + token)


}
4
PacoG

Je viens de faire ça

let token = String(format:"%@",deviceToken as CVarArg).components(separatedBy: CharacterSet.alphanumerics.inverted).joined(separator: "")

le résultat est le même que,

let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
3
satheeshwaran

Obtenir le jeton de périphérique avec le format approprié.

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)
}
0
Basir Alam