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
}
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
print(token)
}
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)
}
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()
}
}
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:)
.
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: "<>"))
}
essaye ça
if #available(iOS 10.0, *) {
let deviceTokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})
}
Swift 3
Le meilleur et le plus simple.
deviceToken.base64EncodedString()
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: "")
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let token = deviceToken.map({ String(format: "%02.2hhx", $0)}).joined()
print("TOKEN: " + token)
}
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()
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)
}