33 votes

Jeton d'appareil Iphone - NSData ou NSString

Je reçois un jeton d'appareil iPhone sous la forme de NSData objet. Lorsque j'ai testé la fonction script de mes notifications, j'ai seulement copié cet objet du journal et les notifications se sont bien déroulées. Cependant, lorsque j'essaie maintenant de le faire automatiquement, j'envoie le jeton de périphérique sous la forme d'une chaîne encodée en ASCII sous la forme d'une variable

self.deviceToken = [[NSString alloc] initWithData:webDeviceToken encoding:NSASCIIStringEncoding];

La chaîne que j'obtiens contient des caractères bizarres et ressemble à ceci "å-0¾fZÿ÷ÎUQüRáqEªfÔk«"

Lorsque le script côté serveur envoie la notification à ce jeton, je ne reçois rien.

Dois-je décoder quelque chose et comment ?

Regardz

108voto

Mladen Points 5699

Ok, j'ai trouvé une solution. Si quelqu'un a le même problème, oubliez l'encodage ASCII, faites simplement la chaîne avec les lignes suivantes :

NSString *deviceToken = [[webDeviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
deviceToken = [deviceToken stringByReplacingOccurrencesOfString:@" " withString:@""];

44voto

Sascha Points 2107

Si quelqu'un cherche un moyen de faire cela en Swift :

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
    let tokenChars = UnsafePointer<CChar>(deviceToken.bytes)
    var tokenString = ""

    for i in 0..<deviceToken.length {
        tokenString += String(format: "%02.2hhx", arguments: [tokenChars[i]])
    }

    print("tokenString: \(tokenString)")
}

Edit : Pour Swift 3

Swift 3 introduit la Data avec une sémantique de valeur. Pour convertir le deviceToken à une chaîne de caractères, vous pouvez procéder comme suit :

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

    var token: String = ""
    for i in 0..<deviceToken.count {
        token += String(format: "%02.2hhx", deviceToken[i] as CVarArg)
    }

    print(token)
}

5voto

user1544494 Points 69

J'ai trouvé cette solution meilleure car iOS peut changer l'utilisation de la description dans les versions futures, donc l'utilisation de la propriété description sur les données peut être peu fiable à l'avenir. Nous pouvons l'utiliser directement en créant un jeton hexagonal à partir des octets du jeton de données.

 - (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken {
 const unsigned *tokenBytes = [deviceToken bytes];
 NSString *hexToken = [NSString stringWithFormat:@"%08x%08x%08x%08x%08x%08x%08x%08x",
                  ntohl(tokenBytes[0]), ntohl(tokenBytes[1]), ntohl(tokenBytes[2]),
                  ntohl(tokenBytes[3]), ntohl(tokenBytes[4]), ntohl(tokenBytes[5]),
                  ntohl(tokenBytes[6]), ntohl(tokenBytes[7])];
 [[MyModel sharedModel] setApnsToken:hexToken];

}

Nous pouvons également stocker le jeton de périphérique dans notre NSUserdefaults et l'utiliser plus tard pour l'envoyer à notre serveur.

2voto

Elraij Points 39

Je ne pense pas que ce soit une bonne solution, car il faut reconstruire la chaîne avant d'envoyer les notifications aux serveurs d'Apple. Utilisez l'encodage Base64 pour transmettre les chaînes de caractères ou quelque chose de similaire.

0voto

aparna Points 56

Autre façon de convertir le jeton de périphérique en chaîne hexa-décimale

NSUInteger capacity = [deviceToken length] * 2;
NSMutableString *stringBuffer = [NSMutableString stringWithCapacity:capacity];
const unsigned char *dataBuffer = [deviceToken bytes];
NSInteger i;
for (i=0; i<[deviceToken length]; ++i) {
    [stringBuffer appendFormat:@"%02X", (NSUInteger)dataBuffer[i]];
}
NSLog(@"token string buffer is %@",stringBuffer);

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