48

Nel mio MainActivity nel mio registro, posso vedere il token utilizzando FirebaseInstanceId.getInstance().getToken() e visualizza il token generato. Ma sembra che nel mio MyFirebaseInstanceIDService, dove si estende a FirebaseInstanceIdService, non venga chiamato lo onTokenRefresh(), dove in questa funzione è stato detto che il token è inizialmente generato qui. Avevo bisogno di chiamare sendRegistrationToServer() per questo sto cercando di sapere perché non va nello onTokenRefresh().Firebase onTokenRefresh() non viene chiamato

Ecco il mio codice

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService { 


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

     sendRegistrationToServer(refreshedToken); 
    } 
} 
+0

Possibile duplicato di [Forza FCM di Firebase onTokenRefresh() da chiamare] (http://stackoverflow.com/questions/37454501/firebase-fcm-force-ontokenrefresh-to-be-called) – Machado

+0

Si prega di leggere completamente le domande . Questa domanda non è un duplicato della domanda che hai menzionato. @Machado –

risposta

75

onTokenRefresh in FirebaseInstanceIdService viene chiamato solo quando viene generato un nuovo token. Se la tua app è stata precedentemente installata e generato un token, non verrebbe richiamato onTokenRefresh. Prova a disinstallare e reinstallare l'app per forzare la generazione di un nuovo token, in questo modo si invoca onTokenRefresh.

anche essere sicuri che il vostro FirebaseInstanceIdService sia correttamente definito nel AndroidManifest.xml

nel file manifesto.

<service 
     android:name="com.bnt.etailers.fcm.MyFireBaseInstanceIDService" 
     android:exported="false"> 
     <intent-filter> 
      <action android:name="com.google.firebase.INSTANCE_ID_EVENT" /> 
     </intent-filter> 
    </service> 

    <service 
     android:name="com.bnt.etailers.fcm.GCMNotificationIntentService" 
     android:exported="false"> 
     <intent-filter> 
      <action android:name="com.google.firebase.MESSAGING_EVENT" /> 
     </intent-filter> 
    </service> 

classe FirebaseInstanceIdService

public class MyFireBaseInstanceIDService extends FirebaseInstanceIdService { 


private static final String TAG = MyFireBaseInstanceIDService.class.getSimpleName(); 

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

    if (refreshedToken!=null) { 
     SettingPreferences.setStringValueInPref(this, SettingPreferences.REG_ID, refreshedToken); 
    } 
    // TODO: Implement this method to send any registration to your app's servers. 
    sendRegistrationToServer(refreshedToken); 
} 
// [END refresh_token] 

/** 
* Persist token to third-party servers. 
* 
* Modify this method to associate the user's FCM InstanceID token with any server-side account 
* maintained by your application. 
* 
* @param token The new token. 
*/ 
private void sendRegistrationToServer(String token) { 
    // Add custom implementation, as needed. 
}} 

classe FirebaseMessagingService.

public class GCMNotificationIntentService extends FirebaseMessagingService { 
// Sets an ID for the notification, so it can be updated 


public GCMNotificationIntentService() { 
    super(); 
} 


@Override 
public void onMessageReceived(RemoteMessage message) { 

}} 
+0

La documentazione sembra confusa (https://firebase.google.com/docs/cloud-messaging/android/client), si dice che il token di registrazione può cambiare quando: l'app elimina l'ID istanza e se richiamo manualmente FirebaseInstanceId.getInstance() .deleteInstanceId(); Mi aspettavo un nuovo token generato, ma in questo caso non succede nulla, onTokenRefresh non viene mai chiamato. – WenChao

+1

Perché salvare il token per le preferenze condivise - se è possibile chiamare [FirebaseInstanceId.getInstance() .getToken()] (https://firebase.google.com/docs/reference/android/com/google/firebase/iid/FirebaseInstanceId) in qualsiasi momento per ottenere il suo valore? –

+0

@WenChao assicurati di chiamare InstanceID del servizio di riproduzione con 'InstanceID.getInstance (this) .deleteInstanceID()' e chiamalo dal thread in background, dopo averlo cancellato con successo, chiama 'InstanceID.getInstance (this) .getID()' per generare un nuovo token – Salis

20

Ho avuto lo stesso problema come te. Il mio errore è stato il seguente: ho inserito i tag <service> all'esterno del tag <application> nel file AndroidManifest.xml.

Ora il mio aspetto:

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 

    <service 
     android:name=".MyFirebaseMessagingService"> 
     <intent-filter> 
      <action android:name="com.google.firebase.MESSAGING_EVENT"/> 
     </intent-filter> 
    </service> 

    <service 
     android:name=".MyFirebaseInstanceIDService"> 
     <intent-filter> 
      <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/> 
     </intent-filter> 
    </service> 
</application> 

e funziona senza alcun problema.

+1

I crediti vanno a questa discussione: http://stackoverflow.com/questions/37351354/firebase-cloud-messaging-notification-not-received-by-device – viplezer

+0

ottima risposta ... è questo l'id di facebook che viene restituito ? ....... perché sto cercando di farlo e sto ottenendo un token molto grande – Juan

+0

Facebook? Firebase? Ottieni il token per Firebase Cloud Messaging nel metodo onTokenRefresh della sottoclasse FirebaseInstanceIDS e si, è una stringa lunga, il mio token è lungo 152 caratteri. – viplezer

2
try { 
    FirebaseInstanceId.getInstance().deleteInstanceId(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

in onCreate metodo per eliminare token.

+0

l'hai provato, genererà rete sull'eccezione del thread principale .... –

+0

'Thread t = new Thread()' risolverà l'eccezione 'MAIN_THREAD' – Pierre

11

Sì, questo potrebbe accadere alcune volte.

Si prega di chiamare il seguente metodo dovunque si desideri ottenere il proprio ID fcm.

try { 
      String refreshedToken = FirebaseInstanceId.getInstance().getToken(); 
      Log.d("Firbase id login", "Refreshed token: " + refreshedToken); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
+1

Buona. Dopo alcune reinstallazioni, il token si interrompe per l'aggiornamento, ma direct getToken ha restituito il token corretto. –

11

Nel mio caso ho dimenticato di aggiungere il permesso internet a manifestare,

<uses-permission android:name="android.permission.INTERNET" /> 

Speranza la maggior parte delle persone non fare questo errore.

10

Provare a reinstallare l'app, disinstallandola prima dal dispositivo o dall'emulatore. Quindi genererà un nuovo token, quindi onTokenRefresh() verrà chiamato di nuovo.

1

Nel mio caso, ho provato tutto ma non è mai stato chiamato onTokenRefresh. Poi cambio il mio WiFi e mi collego alla rete , ora ha funzionato !!. Il precedente WiFi ha una buona connettività internet, non so perché stava accadendo. Potrebbe essere questo può aiutare qualcuno.

1

La reinstallazione ha fatto il trucco per me!