J'implémente des notifications push. Je souhaite enregistrer mon jeton APNS en tant que chaîne.
- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)newDeviceToken
{
NSString *tokenString = [NSString stringWithUTF8String:[newDeviceToken bytes]]; //[[NSString alloc]initWithData:newDeviceToken encoding:NSUTF8StringEncoding];
NSLog(@"%@", tokenString);
NSLog(@"%@", newDeviceToken);
}
La première ligne de code imprime null. le second imprime le jeton. Comment puis-je obtenir mon newDeviceToken en tant que NSString?
ios
objective-c
apple-push-notifications
nsstring
nsdata
Sheehan Alam
la source
la source
NSLog
, celui qui imprimenewDeviceToken
?Réponses:
utilisez ceci :
la source
Si quelqu'un cherche un moyen de le faire dans Swift:
Edit: pour Swift 3
Swift 3 introduit le
Data
type, avec une sémantique de valeur. Pour convertir ledeviceToken
en chaîne, vous pouvez procéder comme suit:la source
let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
qiita.com/mono0926/items/3cf0dca3029f32f54a09"%02.2hhx
fait?Quelqu'un m'a aidé avec ça, je suis juste en train de passer
la source
const unsigned *tokenBytes = [deviceToken bytes]; NSMutableString *hexToken = [NSMutableString string]; for (NSUInteger byteCount = 0; byteCount * 4 < [deviceToken length]; byteCount++) { [hexToken appendFormat:@"%08x", ntohl(tokenBytes[byteCount])]; }
Important: APNs device tokens are of variable length. Do not hard-code their size.
Dit Apple.Vous pouvez utiliser ceci
la source
description
.[token appendFormat:@"%02.2hhx", data[i]];
comme Amazon SNS nécessite des minuscules.Pour ceux qui veulent dans Swift 3 et la méthode la plus simple
la source
deviceToken.reduce("", {$0 + String(format: "%02X", $1)})
Explication de
%02.2hhx
la réponse au vote élevé :%
: Présente lex
spécificateur de conversion.02
: La largeur minimale de la valeur convertie est de 2. Si la valeur convertie comporte moins d'octets que la largeur du champ, elle doit être complétée par0
à gauche..2
: Donne le nombre minimum de chiffres à afficher pour lex
spécificateur de conversion.hh
: Spécifie que lex
spécificateur de conversion s'applique à un argument char signé ou char non signé (l'argument aura été promu en fonction des promotions d'entiers, mais sa valeur doit être convertie en char signé ou en char non signé avant l'impression).x
: L'argument non signé doit être converti au format hexadécimal non signé dans le style "dddd"; les lettres "abcdef" sont utilisées. La précision spécifie le nombre minimum de chiffres à afficher; si la valeur convertie peut être représentée en moins de chiffres, elle doit être développée avec des zéros non significatifs. La précision par défaut est 1. Le résultat de la conversion de zéro avec une précision explicite de zéro ne doit être aucun caractère.Pour plus de détails, consultez la spécification IEEE printf .
Sur la base de l'explication ci-dessus, je pense qu'il est préférable de passer
%02.2hhx
à%02x
ou%.2x
.Pour Swift 5, les méthodes suivantes sont toutes réalisables:
Le test est le suivant:
la source
C'est ma solution et cela fonctionne bien dans mon application:
NSData
enNSString
avecstringWithFormat
la source
-description
, donc ce n'est pas plus sûr que la réponse acceptée.description
deviceToken comme le dit jszumski.description
savoir si vous l'appelez directement ou si vous l'utilisez via une autre méthode, car le format de la chaîne renvoyée peut être modifié à tout moment. La bonne solution est ici: stackoverflow.com/a/16411517/108105Je pense que la conversion de deviceToken en chaîne d'octets hexadécimaux n'a aucun sens. Pourquoi? Vous l'enverrez à votre backend, où il sera transformé en octets pour être poussé vers APNS. Alors, utilisez la méthode de NSData
base64EncodedStringWithOptions
, poussez-la sur le serveur, puis utilisez des données inversées décodées en base64 :) C'est tellement plus facile :)la source
Dans iOS 13
description
se cassera alors utilisez ceciPour plus de clarté, décomposons cela et expliquons chaque partie:
La méthode map opère sur chaque élément d'une séquence. Étant donné que Data est une séquence d'octets dans Swift, la fermeture passée est évaluée pour chaque octet dans deviceToken. L'initialiseur String (format :) évalue chaque octet dans les données (représenté par le paramètre anonyme $ 0) à l'aide du spécificateur de format% 02x, pour produire une représentation hexadécimale à 2 chiffres complétée par zéro de l'entier octet / 8 bits. Après avoir collecté chaque représentation d'octet créée par la méthode map, joins () concatène chaque élément en une seule chaîne.
PS n'utilise pas la description donne une chaîne différente dans iOS 12 et iOS 13 et n'est pas sûre selon la portée future. Les développeurs n'auraient pas dû s'appuyer sur un format spécifique pour la description d'un objet.
Pour plus d'informations, lisez This .
la source
Dans iOS 13, la description sera dans un format différent. Veuillez utiliser le code ci-dessous pour récupérer le jeton de l'appareil.
la source
length
dans la boucle for devrait être changé enlen
. Apparemment, un changement trop petit pour que je puisse faire un montage .. Mais le reste fonctionne parfaitement!C'est une solution un peu plus courte:
la source
Version Swift fonctionnelle
Bon mot:
Voici dans une forme d'extension réutilisable et auto-documentée:
Vous pouvez également utiliser
reduce("", combine: +)
au lieu dejoinWithSeparator("")
pour être considéré comme un maître fonctionnel par vos pairs.Edit: J'ai changé String ($ 0, radix: 16) en String (format: "% 02x", $ 0), car les nombres à un chiffre devaient avoir un zéro de remplissage
(Je ne sais pas encore comment marquer une question comme un double de cette autre , alors je viens de publier à nouveau ma réponse)
la source
2020
jeton sous forme de texte ...
ou si vous préférez
(le résultat est le même)
la source
Jeter ma réponse sur la pile. Évitez d'utiliser l'analyse des chaînes; Ce n'est pas garanti par la documentation que NSData.description fonctionnera toujours de cette façon.
Implémentation Swift 3:
la source
J'ai essayé de tester deux méthodes différentes avec le format
"%02.2hhx"
et"%02x"
et le résultat est que le plus rapide est
"%02x"
en moyenne 2,0 contre 2,6 pour la version réduite:la source
Utilisation updateAccumulatingResult est plus efficace que les diverses autres approches trouvés ici, alors voici la Swiftiest façon de stringify vos
Data
octets:la source
Pour Swift:
la source
Qu'en est-il de la solution en une seule ligne?
Objectif c
Rapide
la source
Voici comment procéder dans Xamarin.iOS
la source
la source
Rapide:
la source
la source
Rapide
la source
Utilisez une excellente catégorie!
// fichier .h
// fichier .m
@fin
// AppDelegate.m
Fonctionne très bien!
la source
Swift 3:
Si quelqu'un cherche un moyen d'obtenir un jeton d'appareil dans Swift 3. Utilisez l'extrait de code modifié ci-dessous.
la source
la source
La solution @kulss postée ici, tout en manquant d'élégance mais ayant le mérite de la simplicité ne fonctionne plus sous iOS 13, puisqu'elle
description
fonctionnera différemment pour NSData. Vous pouvez toujours l'utiliserdebugDescription
.la source
Essayez celui-ci à moins que les données ne soient terminées par null.
NSString* newStr = [[NSString alloc] initWithData:newDeviceToken encoding:NSUTF8StringEncoding];
la source
la source