2016-07-12 72 views
12

Ok, quindi ho un'app che al primo avvio ti porta attraverso alcune diapositive di benvenuto, quindi ti porta a una pagina di accesso/registrazione e poi a MainActivity.Token FCM Firebase - Quando inviare al server?

ho appena implementato FCM ei servizi generare un tokenprima qualsiasi di queste pagine sono stati visti da parte dell'utente. Come posso fare in modo che il servizio venga eseguito dopo il. Arrivo a MainActivity?

Il problema è che sto cercando di inviare il token non appena viene aggiornata alla MySQL DB all'account utente appropriato, ma dal momento che l'utente non ha firmato ancora, questo è null e il mio messaggio al server non riesce. Qual è un buon modo per progettare questo? Ho pensato di salvare il token in SharedPreferences e di inviarlo al server dopo che l'utente ha effettuato l'accesso ma questo crea molte complicazioni quando il token viene aggiornato in un secondo momento ?!

Possibile soluzione:

Non sono sicuro capisco perfettamente come i 2 servizi eseguiti, ma dico in onTokenRefresh Ho appena risparmio il gettone nella SharedPreferences e MainActivity ottengo il valore da SP e poi mando al server. In tal caso, quando il token viene aggiornato, il nuovo valore andrà immediatamente a SharedPreferences. Ma avrei ancora bisogno di controllare se è un nuovo valore in SP e poi ricaricarlo sul server. Questo è confusionario!

+0

http://engineering.letsnurture.com/firebase-cloud-messaging/ –

risposta

8

Sì Il token FCM viene generato automaticamente. Ma prova a vedere questo in una diversa angolazione.

Ecco come l'ho gestito.

Consenti a FCM di generare token non appena l'app viene avviata. OnTokenRefresh sarà chiamato e basta salvarlo nelle preferenze come:

@Override 
public void onTokenRefresh() { 
    // Get updated InstanceID token. 
    String refreshedToken = FirebaseInstanceId.getInstance().getToken(); 
    Log.d(TAG, "Refreshed token: " + refreshedToken); 

    sendRegistrationToServer(refreshedToken); 
} 

private void sendRegistrationToServer(String token) { 
    // Add custom implementation, as needed. 
    SharedPreferenceUtils.getInstance(this).setValue(getString(R.string.firebase_cloud_messaging_token), token); 

    // To implement: Only if user is registered, i.e. UserId is available in preference, update token on server. 
    int userId = SharedPreferenceUtils.getInstance(this).getIntValue(getString(R.string.user_id), 0); 
    if(userId != 0){ 
     // Implement code to update registration token to server 
    } 
} 

Spero che siate chiari con la strada. Chiedi se hai bisogno di più spazio.

+0

Quindi potrei fare la stessa cosa ma anche nel mio MainActivity al primo avvio inviare il token al server perché l'unico modo per usare l'app è registrarsi e la prima volta che il servizio viene avviato non vi è alcun ID utente, quindi non verrà inviato al server. Immagino sia la mia soluzione. Non lo mandi al server la prima volta che ricevi un token? O lo fai anche dopo, ma non hai incluso il codice? – iBobb

5

abbiamo gestito in questo modo:

  1. nostro server creare/aggiornare il valore simbolico contro un id utente (chiave primaria)
  2. Usa 2 SharedPreferences
    1. String - String gettone
    2. Booleano (aggiornato): se il token è aggiornato sul server o meno.

In caso di token di aggiornamento aggiorniamo la stringa token e impostiamo il valore booleano false. In seguito ogni volta che l'utente effettua il login ogni volta che si verifica booleano (aggiornato), se questo è falso, si collega il token corrente al suo id e lo si invia al server e si imposta aggiornato su true.

+1

c'è un modo per ottenere il token usando l'e-mail di un utente (tutto sul lato server)? – Andrea

11

Nota che si può sempre recuperare il token con:

FirebaseInstanceID.getInstance().getToken(); 

Ciò restituirà null se il token non è ancora stato generato o il token se è stato generato. Nel tuo caso è molto probabile che il token verrà generato dal momento in cui l'utente ha effettuato l'accesso. Dovresti essere in grado di inviarlo al tuo server delle app non appena l'utente ha effettuato l'accesso. Se non è disponibile, allora tu lo invierebbe nel callback onTokenRefresh come menzionato da Chintan Soni.

Problemi correlati