Obtenir le device token pour notification Push

Bonjour à  tous,


 


Je voulais savoir si il y avait moyen de connaà®tre le device token, nécessaire pour les notifications push, d'un téléphone après que la fonction didRegisterForRemoteNotificationsWithDeviceToken ait été appelé ?


Et celle-ci n'a pas été sauvé dans le téléphone!


Je voudrais savoir si on peut accéder à  ce device token car j'ai lu qu'il pouvait changer et je ne suis pas sur que celui que j'ai enregistré dans le téléphone soit mis à  jour...


 


Bien à  vous.


 


Réponses

  • MagiicMagiic Membre

    Il n'y a pas d'autres moyens de récupérer le deviceToken que la méthode que tu cites il me semble. Et oui effectivement il peut changer donc y accéder ailleurs qu'à  partir de cette méthode n'a pas forcément de sens.


     


    Pourquoi tu veux le récupérer d'une autre façon ?


  • En faite, je pense avoir fait une erreur dans mon application qui est déjà  déployé sur plusieurs téléphones.

    Voici mon code:



    - (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    NSArray *tpaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *tdocumentsDirectory = [tpaths objectAtIndex:0];
    NSString *tpath = [tdocumentsDirectory stringByAppendingPathComponent:@prefs.plist];
    NSDictionary *dictread = [[NSDictionary alloc] initWithContentsOfFile:tpath];
    NSString *token = [dictread objectForKey:@token];
    if([token isEqualToString:@none] || [token isEqualToString:@"0"]){
    NSString *device = [[[[deviceToken description]
    stringByReplacingOccurrencesOfString: @< withString: @""]
    stringByReplacingOccurrencesOfString: @> withString: @""]
    stringByReplacingOccurrencesOfString: @ withString: @""];

    NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES) lastObject];
    NSString *path = [documentsPath stringByAppendingPathComponent:@prefs.plist];
    NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithContentsOfFile:path];
    [dict setValue:token forKey:@token];
    [dict writeToFile:path atomically: YES]
    // On envoi au serveur le token
    [self setTokenApns];
    }

    }


    Je fais un test pour savoir si il est déjà  encodé dans le téléphone avant de l'envoyer au serveur et de le sauver. Ce qui est à  mon avis mon problème, car je ne savais pas qu'il pouvais changer ! Du coup, je ne sais pas comment rattraper le coup sur les téléphones qui ont le device token qui a changé, ni savoir quelles téléphones ont le device token qui a changé.  Quelqu'un à  une idée??


  • CéroceCéroce Membre, Modérateur
    De toute façon, le token doit être renvoyé à  chaque fois au serveur. Il ne doit pas être stocké. C'est marqué dans le doc.
    Il change notamment quand tu remets à  zéro l'iPhone.
  • Ok merci donc je suis bloqué pour ceux qui ont l'application existante je suppose...

  • Donc si je comprends bien dans la doc d'Apple, à  chaque lancement de l'application on fait la demande au près d'Apple du device Token via la ligne de commande suivante:



    [[UIApplication sharedApplication] registerForRemoteNotifications]

    Et on enregistre sur notre serveur le token recu via la méthode didRegisterForRemoteNotificationsWithDeviceToken.


     


    C'est bien ça ?

  • Et par conséquent la fonction didRegisterForRemoteNotificationsWithDeviceToken est toujours appelé à  chaque lancement de l'application ?


  • CéroceCéroce Membre, Modérateur
    oui et oui.
  • Ok , je suis donc suppris qu'il y ait toujours besoin de demander à  Apple le device token d'autant plus qu' il ne varie très rarement dans mon cas, je suis tombé sur ce bug après deux ans d'utilisation de mon application !


    Je trouve ca dommage de toujours devoir faire une requête vers Apple pour le device_token qui change rarement....


  • AliGatorAliGator Membre, Modérateur
    juillet 2016 modifié #10
    registerForRemoteNotifications est optimisé dans son implémentation. Il ne fait une requête auprès des serveurs d'Apple que si c'est nécessaire et que le token a changé, c'est expliqué dans la doc.
     

    The device token is your key to sending push notifications to your app on a specific device. Device tokens can change, so your app needs to reregister every time it is launched and pass the received token back to your server. If you fail to update the device token, remote notifications might not make their way to the user's device. Device tokens always change when the user restores backup data to a new device or computer or reinstalls the operating system. When migrating data to a new device or computer, the user must launch your app once before remote notifications can be delivered to that device.

    Never cache a device token; always get the token from the system whenever you need it. If your app previously registered for remote notifications, calling the registerForRemoteNotifications method again does not incur any additional overhead, and iOS returns the existing device token to your app delegate immediately. In addition, iOS calls your delegate method any time the device token changes, not just in response to your app registering or re-registering

    Source


    Donc ne t'inquiète pas sur le fait que ça fasse une requête à  Apple à  chaque lancement, car ce n'est pas le cas en pratique.

    ---

    De plus, appeler systématiquement cette méthode est de toute façon nécessaire pour une autre raison : l'utilisateur peut avoir changé les Settings de son app pour finalement refuser les notifications sur l'application pendant un moment, puis les réactiver plusieurs mois après, etc... donc il faut aussi côté appli que tu utilises rgisterForRemoteNotifications pour mettre à  jour cet état.
     

    The user can change the notification settings for your app at any time using the Settings app. Because settings can change, always call the registerUserNotificationSettings: at launch time and use the application:didRegisterUserNotificationSettings: method to get the response. If the user disallows specific notification types, avoid using those types when configuring local and remote notifications for your app.

    Source

  • Merci Aligator c'est encore une fois beaucoup plus clair avec tes explications. J'avoue que je pensais qu'il faisait la demande tout le temps auprès d'Apple car la méthode était tout le temps appelée et retournait tout le temps un device token! C'est une erreur de ma part, je dois plus me fier à  la doc d'Apple. Je voulais aussi savoir si on supprime l'application et ensuite la réinstalle, le device token est aussi redemandé chez Apple ? Obtient on un nouveau device_token ?

  • À priori oui. tu peux faire le test pour voir ;)


  • Quand je fais le test en mode développement, le device token change tout le temps...


Connectez-vous ou Inscrivez-vous pour répondre.