2015-12-15 14 views
8

Ho riscontrato un problema in cui un utente ha iniziato a ricevere notifiche doppie dopo aver disinstallato e reinstallato la mia app, poiché il dispositivo ha inviato al mio server 2 token APNS diversi: uno dalla prima installazione e l'altro dopo la reinstallazione l'applicazione. Dato che i token erano diversi, non potevo sapere che si tratta dello stesso dispositivo.Come gestire le modifiche ai token APN di iOS

Fino a quando non usciva iOS 9, ogni volta che disinstallavo e reinstallavo l'app, ottenevo sempre gli stessi APN, quindi era facile sapere che si tratta dello stesso dispositivo che l'utente usava come prima. Da iOS 9, sembra che il token APNS sia cambiato su ogni installazione.

La mia domanda è la domanda se un client disinstalla e reinstalla l'app e aggiorna il suo token APNS invece di aggiungere un nuovo token?

Mi chiedo come mi sembra che la maggior parte degli sviluppatori iOS abbia dovuto gestire, ma non sono riuscito a trovare alcuna best practice di Apple su come affrontarlo, quindi ho sperato che altri possano condividere la loro esperienza con questo problema .

+0

L'utente deve effettuare il login o identificarsi per utilizzare l'app e ricevere le notifiche? – Ares

+0

@ares Sì, ma ogni utente può avere più dispositivi connessi, quindi quando un utente si connette non posso dire se un nuovo dispositivo o APNS cambia dopo la reinstallazione. – Kuf

+0

Che ne dici di allegare '[[UIDevice currentDevice] name];' ai meta dati token? – Ares

risposta

6

Questo è come abbiamo finito per risolverlo:

Su ogni lancio app:

  1. creare notifica push gettone
  2. c'è un gettone in localStorage?
    • sì - confronta i token con quelli locali. sono identici?
      • sì - tornare
      • no - server di aggiornamento con nuovo token, e dopo la risposta del server con 'OK' salvarlo localmente in deposito e portachiavi
    • locale no - controllo c'è un token nel portachiavi
      • sì - confronta i token con il portachiavi. sono identici?
        • sì - salva token nel localStorage e tornare
        • no - server di aggiornamento con nuovo token, e dopo la risposta del server con 'OK' salvarlo localmente nel locale
          stoccaggio e portachiavi
    • no - aggiorna il server con un nuovo token e dopo la risposta del server con "OK" salvalo localmente nella memoria locale e portachiavi

Se qualcuno ha un modo più elegante per risolverlo mi piacerebbe sentirne parlare

+0

Preferisco usare la chiave' identifierForVendor'. All'avvio di ogni app, controlla se il valore di chiave 'appnameVendor' .Se non lo carica dal sistema e annota.Posta al server il nuovo token e quel valore di' appnamVendor'. Il server si occuperà di crearne uno nuovo o di aggiornare uscito da uno di base che valorizza e – sahara108

+0

@ sahara108 Ho pensato di farlo (questo è quello che faccio per Android), ma perché ho bisogno di salvare il token per sapere se è stato modificato, io uso il token invece di aggiungere un'altra variabile memorizzata nel portachiavi. – Kuf

+0

Si memorizza solo una variabile in entrambi i modi. L'unica cosa diversa è che se hai più applicazioni, puoi riutilizzare 'identifierForVendor' perché è lo stesso nella tua app. – sahara108