Je viens de migrer vers FCM. J'ai ajouté ma classe qui s'étend de FirebaseInstanceIdService pour recevoir un refreshedToken selon les besoins.
Ma question concerne spécifiquement le cas où l'utilisateur installe mon application pour la première fois et, pour une raison quelconque, incapable de recevoir un identifiant d'enregistrement de onTokenRefresh. Comment sommes-nous censés gérer cela? Puis-je définir un récepteur de diffusion à partir de ma classe FirebaseInstanceIdService qui notifiera l'activité principale lorsqu'un ID d'enregistrement est reçu?
utiliser les codes ci-dessous:
@Override
public void onTokenRefresh() {
// Get updated InstanceID token.
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d("FCN TOKEN GET", "Refreshed token: " + refreshedToken);
final Intent intent = new Intent("tokenReceiver");
// You can also include some extra data.
final LocalBroadcastManager broadcastManager = LocalBroadcastManager.getInstance(this);
intent.putExtra("token",refreshedToken);
broadcastManager.sendBroadcast(intent);
}
dans votre activité principale:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
LocalBroadcastManager.getInstance(this).registerReceiver(tokenReceiver,
new IntentFilter("tokenReceiver"));
}
BroadcastReceiver tokenReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String token = intent.getStringExtra("token");
if(token != null)
{
//send token to your server or what you want to do
}
}
};
}
Modifiez cela dans le fichier manifest.xmltools:node="replace " À tools:node="merge".
Pour autant que je sache, le jeton sera nul uniquement lorsque vous essayez d'exécuter votre application sur un émulateur sur lequel le service Google Play n'est pas disponible et lorsque vous utilisez un identifiant de messagerie double sur votre Google Play Store (sur votre appareil actuel), mais uniquement un identifiant de courrier électronique est vérifié pour l'utilisation. Ce sont les cas qui vous donneront un jeton nul et j'ai déjà implémenté FCM dans mon nouveau projet. Donc, pour le reste des cas, le jeton ne sera pas nul.
Je faisais face au même problème. J'ai parcouru beaucoup de SO posts et autres forums et j'ai trouvé une solution qui fonctionnait pour moi. La documentation de FCM recommande d'utiliser cette méthode pour obtenir un jeton.
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
J'ai trouvé un article en ligne (je m'excuse, je ne me souviens plus lequel. Je l'ai trouvé il y a longtemps) qui utilisait cette méthode à la place:
String refreshedToken = FirebaseInstanceId.getInstance().getToken() (String authorizedEntity, String scope);
La documentation FCM décrit la première méthode comme suit:
Renvoie le jeton principal du projet Firebase par défaut.
Alors que le second est décrit comme:
Renvoie un jeton qui autorise une entité à exécuter une action pour le compte de l'application identifiée par l'ID d'instance . Ceci est similaire à un jeton OAuth2 sauf que cela s'applique à l'instance d'application au lieu d'un utilisateur . Par exemple, pour obtenir un jeton pouvant être utilisé pour envoyer des messages à une application via FirebaseMessaging, définissez l'ID de l'expéditeur et définissez-le sur "FCM".
J'ai cherché à savoir pourquoi le premier appel de méthode prenait plus de temps pour renvoyer un jeton, mais je n'ai pas encore trouvé de réponse. J'espère que cela t'aides.
Utilisez cette classe s'étend avec ..
public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {
private static final String TAG = "MyFirebaseIIDService";
public static final String REGISTRATION_SUCCESS = "RegistrationSuccess";
@Override
public void onTokenRefresh() {
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d(TAG, "Refreshed token: " + refreshedToken);
Toast.makeText(MyFirebaseInstanceIDService.this,refreshedToken,Toast.LENGTH_LONG).show();
}
}
en fonction de la logique de votre application, vous pouvez écrire le code pour gérer le "nouveau" jeton directement dans la méthode FirebaseInstanceIdService.onTokenRefresh()
ou utiliser LocalBroadcast pour envoyer ces informations à votre activité si vous devez modifier l'interface utilisateur lorsque cet événement se produit.
Notez que lorsque onTokenRefresh()
est appelé, votre activité peut être fermée.
Une implémentation possible pourrait combiner les deux options:
onTokenRefresh()
pour envoyer le jeton sur votre serveurSi vous l'exécutez sur votre émulateur, vérifiez que les services Google Play sont activés dans Outils -> Android -> Gestionnaire de SDK -> Outils SDK -> Services Google Play.
Une fois installé, redémarrez Android Studio et votre émulateur.
Ça a fonctionné pour moi