2013-11-01 20 views
7

Come faccio a invalidare in modo affidabile (rimuovere dal profilo utenti sul mio server) il token di push di un dispositivo per gli utenti del mio servizio quando si disconnettono dalla mia app?Invalidate il token push del dispositivo iOS sul logout utente

Mantengo una serie di stringhe contenenti token di apns sui miei profili utente, aggiungendone una ogni volta che l'utente abilita le notifiche push su un dato dispositivo.

In seguito mi sono reso conto che il token push è univoco per il dispositivo, ma ovviamente non sa nulla dei miei account utente interni, quindi se un utente si disconnette e un altro accede (stesso dispositivo) ha lo stesso token. Quindi l'utente corrente del dispositivo riceve notifiche push dirette per entrambi.

La soluzione di base è quella di rimuovere un token di dispositivo dal profilo utente al logout, ma sto arrivando con un gruppo di grattacapi, come penso che attraverso:

  1. Logout non dovrebbe richiedere rete accesso - Posso provare a notificare il mio server, ma ho bisogno di disconnettersi per riuscire in modo asincrono anche se l'utente non ha accesso alla rete (?)
  2. Il token dispositivo reale potrebbe essere sconosciuto - se l'utente ha temporaneamente spento il permesso push quindi il token corrente non è dato. E il dispositivo di archiviazione < -> le informazioni chiave sembrano alquanto tenue dal momento che le modifiche identificatoreForVendor per installazione e i metodi UDID sono deprecati.
  3. Do univoca lato server (all'aggiunta di un token a un account, assicurarsi che lo stesso token non sia impostato per nessun altro account) - questo dipende da un secondo accesso dell'utente, che non è garantito.

Ci sono più casi limite che mi mancano e quali strategie posso utilizzare per aggirarli?

risposta

3

I tuoi gotcha presentano alcune delle situazioni difficili che potresti incontrare. Ti consiglierei di cambiare o assicurarti che la logica dell'invio push sia interamente sul lato server: collega un pushtoken a un identificativo utente di tua scelta (il che significa che un token push potrebbe essere collegato a diversi utenti). Questo identificatore che controlli è l'identificatore dell'account che è mirato quando devi inviare un push. In questo modo, puoi controllare quale utente deve ricevere una notifica e recuperare il suo pushtoken basato su questo identificatore (rispetto a qualsiasi identificatore di dispositivo fornito da Apple che presuppone che 1 dispositivo = 1 utente).

Nel caso in cui il tuo utente si disconnette offline, non lo saprai. Potresti inviare a quell'utente una notifica. Se l'utente sceglie di agire su di esso, la tua app si aprirà e potrai, a quel punto, annullare l'iscrizione dell'identificatore utente dal tuo server (dal momento che è ovviamente online in questo momento).

+0

Non sono sicuro di seguire il primo paragrafo. Essenzialmente ho già la prima metà (un token può essere collegato a più utenti) già, ma non sono sicuro di come distinguerei l'utente per cui è valido. Forse qualcosa come un timestamp di quando è stato salvato per la prima volta su quel profilo utente, quindi l'ultimo sarebbe quello valido? – owenfi

+0

Grazie per il punto in merito alla reazione alla disconnessione offline seguita dalla notifica push, sembra la migliore soluzione per il caso fornita dall'API e allevia le mie preoccupazioni in merito a un avvertimento. – owenfi

+0

Informazioni sul primo paragrafo, quando si memorizza il pushtoken sul server, è possibile inviare l'identificatore utente contemporaneamente. Il tuo server saprà a questo punto se l'utente è valido o no, no? Anche se non sono sicuro di aver capito correttamente la tua domanda ... il pushtoken sarà lo stesso, indipendentemente dal timestamp con cui è stato generato; Non sono sicuro di seguire la tua idea. – Nick

0
  1. quando la vostra applicazione viene eseguito per la prima volta su un dispositivo genera un UUID (Universally Unique ID) e salvare questo il dispositivo che utilizzano NSUserDefaults

    NSString * uuid = [[NSUserDefaults standardUserDefaults] objectForKey: @" app_uuid "];

    if(uuid == nil){ 
        uuid = [[NSUUID UUID] UUIDString]; 
        [[NSUserDefaults standardUserDefaults] setObject:uuid forKey:@"app_uuid"]; 
        [[NSUserDefaults standardUserDefaults] synchronize]; 
    
    } 
    

    questo uuid saranno utilizzati per identificare istanza di applicazione univoco un utente sta utilizzando e collegati per (se si desidera che l'utente sia in grado di accedere a più dispositivi con lo stesso user id).

  2. quindi ogni volta che si invia token al server, inviare id utente e app uuid con esso.e sul lato server controlla se l'app uuid esiste già, se sì sovrascrivi la tupla con un nuovo token e id utente e se non crei e salva nuova tupla con id utente, token e uuid.

  3. quando si invia la notifica a un utente specifico ottenere tutte le tuple con id utente, ottenere i token da loro e inviare notifica utilizzando questi token.

Problemi correlati