2016-06-28 20 views
5

Ho intenzione di sviluppare un'app che utilizza la funzione Gruppi di dispositivi. Come ho capito, devo prima inviare il token di registrazione corrente che ottengo sul client Android nel metodo onTokenRefresh al server e quindi aggiungere questo token di registrazione al gruppo di dispositivi appropriato (o crearlo se non esiste) tramite richiesta HTTP. Tuttavia, vedo un potenziale rischio di perdita dei token di registrazione, poiché l'utente di app Android può, ad esempio, cancellare più volte i dati dell'app. Come prevenirlo? Cosa succede quando viene superato un limite di 20 membri? E 'possibile verificare se qualche gruppo esiste già o no?Firebase Cloud Gruppi di messaggi di Messaggistica perdite

+1

Cross-post: https://groups.google.com/d/msg/firebase-talk/B8wG6CMC8lA/X6KvwaydAwAJ –

+0

Dopo 4 mesi hai qualche progresso? Mi piacerebbe sapere come gestire i token scaduti nei gruppi di dispositivi; dovresti in qualche modo identificare in modo univoco il dispositivo ... – Galya

+1

@Galya Ho deciso di non utilizzare i gruppi di dispositivi, uso semplicemente argomenti con ID utente al loro interno. – Matis

risposta

3

vedo, però, un potenziale di fuoriuscita di gettoni di registrazione, come Android app maggio utente per esempio cancellare i dati più volte di app. Come prevenirlo?

Se per impedendo intendi invalidante Elimina i dati per la vostra applicazione in App Manager, è necessario fare riferimento a questo post. Il accepted answer afferma che non è possibile.

Tuttavia, Jakar's answer fornisce una soluzione dove invece di Cancella dati, Gestione Spazi apparirà invece. Non l'ho ancora provato, quindi non posso dirlo con certezza. Le upvotes parlano da sole però.

Ma, se mai i dati dell'app è spazzato/eliminato da parte dell'utente, è necessario fare riferimento a quanto stabilito nelle FirebaseInstanceId documentazione:

ID istanza è stabile se non quando:

  • App elimina ID istanza

  • App viene ripristinato su un nuovo dispositivo

  • utente disinstalla/reinstallare l'applicazione cancella

  • utente dati delle applicazioni

Nei casi sopra un nuovo Instance ID viene generato e l'applicazione ha bisogno di ricreare l'autorizzazione gettoni generato in precedenza attuazione onTokenRefresh().


Cosa accade quando viene superato un limite di 20 membri?

Non sono sicuro che la questione è qui .. Ma se siete di pertinenza aggiunta di dispositivi a un gruppo di periferiche più del massimo ...

non sono riuscito a trovarlo chiaramente indicato nella FCM: Device Group Messaging docs, ma se si fa riferimento al Aggiungi a gruppo sezione, si afferma:

un'operazione di successo restituisce un notification_key.

Quindi da questo, credo che se mai tenta di aggiungere un altro dispositivo a un gruppo di dispositivi già maxed, l'operazione fallire.

Suggerisco di utilizzare Topics invece, se pensi di averne più di 20. Ma non so davvero quale sia il tuo caso d'uso, quindi .. la tua chiamata.


ed è possibile verificare se un certo gruppo esiste o no già?

Per questo, si dovrebbe fare uso del notification_key e notification_key_name. Come per il docs:

Il notification_key_name è un nome o identificatore (ad esempio, può essere un nome utente) che è unico per un dato gruppo. I numeri notification_key_name e notification_key sono univoci per un gruppo di token di registrazione. È importante che notification_key_name sia unico per app client se si dispone di più app client per lo stesso ID mittente. Ciò garantisce che i messaggi vengano inviati all'app di destinazione desiderata.

E sottolineando sulla dichiarazione:

gestione di base dei gruppi di dispositivi - dispositivi di creazione e la rimozione gruppi, e l'aggiunta o la rimozione - è di solito eseguita tramite il server app.

Le chiavi e i nomi devono essere sul server, in modo da poter verificare se esiste già o meno.

+2

Con "prevenzione" intendevo evitare la perdita dell'ID di registrazione. Cancellare i dati delle app era solo un esempio di come perdere rapidamente quelli: se un nuovo token viene assegnato e quello vecchio non viene rimosso, allora abbiamo una perdita. – Matis

+0

Vedo. - * se viene assegnato un nuovo token e quello vecchio non viene rimosso allora abbiamo una perdita * - Non è semplicemente gestita sul lato server? Facendo uso degli ID canonici? Altri scenari dovrebbero essere gestiti nell'app client stessa? –

+3

Gli ID canonici possono essere una soluzione, ma non sono chiaramente menzionati nei documenti FCM (solo GCM). (C'è una menzione su https://firebase.google.com/docs/cloud-messaging/server#response, ma non spiega perché o quando vengono restituiti questi ID canonici). Ma voglio usare i gruppi di dispositivi, quindi utilizzo l'ID di registrazione del singolo dispositivo solo quando lo aggiungo a un gruppo. Vorrei anche chiarire la mia ultima domanda: so che ho bisogno di archiviare gruppi sul server della mia app, ma a volte potrebbero non essere sincronizzati con i server FCM, è per questo che vorrei verificare se un gruppo con 'notification_key_name' esiste. – Matis

2

Attualmente sto facendo quanto segue con un certo successo, ma non completamente testato o ridimensionato ancora.

L'app utilizza firebase come back-end e sto aggiungendo FCM per implementare le notifiche push.

Ho bisogno di gruppi da gestire quando un utente può trovarsi su diversi dispositivi o più dispositivi.

I memorizzare il restituito notification_key valore e il registration_id (token) per ciascun dispositivo con il profilo cioè

profiles 
    -profile_id 
    -FCM 
     -notification_key:value 
     -registration_ids 
     -device_1_uuid:token_for_device_1 
     -device_2_uuid:token_for_device_2 

Quando un utente effettua il primo lì sono dati sotto dell'FCM nodo cioè non notification_key e non registration_ids

Ogni volta che un utente accede, si collegano al proprio profile_id.

ottengo il token FCM e poi

Se non c'è notification_key (cioè prima volta su qualsiasi dispositivo) creo il gruppo utilizzando la profile_id come notification_key_name e memorizzare il notification_key che ritorna.

Se è presente un tasto notification_key (accesso di ritorno o primo accesso su un nuovo dispositivo), vedo se c'è un registration_id per il dispositivo corrente e in caso contrario (primo accesso sul nuovo dispositivo), aggiungere il device_uuid: coppia token a registration_ids.

Se c'è (ritorno sign-on) rimuovo il token memorizzato dal gruppo FCM e sostituisco il vecchio token nel mio registration_ids memorizzato con il token che ho appena ricevuto.

Posso ora inviare un messaggio a tutti i dispositivi utilizzati da quell'utente (profilo) inviando al proprio profile_id e non dovrei perdere i token perché elimini quelli vecchi.

Tuttavia, non ho modo di sapere perché non sembra esserci API per leggere solo il gruppo e le token in modo che i gruppi possano essere puliti ogni tanto.

Inoltre, il mio codice iniziale era in errore e non ho acquisito il tasto notification_key, quindi ora non posso aggiungere, rimuovere o fare nulla a uno dei miei gruppi. Odio l'idea che dovrò lasciare gruppi bruciati in giro nella nuvola di Firebase per sempre.

Penso che FCM dovrebbe fornire più accesso API per aiutarci a mantenere il posto in ordine.

+0

Sto seguendo quasi lo stesso approccio, ho una domanda. FCM elimina automaticamente il gruppo di dispositivi se non sono presenti dispositivi associati. Come gestisci questo caso? Per quanto ne so, se un token non è più valido, viene automaticamente rimosso dal gruppo in FCM. –

+0

Quando rimuovo un token dal gruppo perché è stato sostituito sul mio dispositivo, se è l'ultimo/solo token, il gruppo FCM viene eliminato e viene visualizzato un errore quando provo a registrare il nuovo token. Intrappolamento l'errore con il suo messaggio di testo, ad esempio "notazione_key non trovata" e richiamare la mia funzione create_group su di esso in modo da ricreare un nuovo gruppo con lo stesso tasto_di notifica di prima e aggiunge il token ad esso. Questo è un po 'hacky ma in un modo simile, uso anche il testo di errore "notification_key esiste già" come condizione per registrare un token aggiuntivo per un nuovo dispositivo. – blythburgh

+0

Sì, questo è il modo in cui lo sto gestendo ora, ma mi stavo chiedendo se c'è un approccio migliore dal momento che sembra un po 'hacky. –