Supposons que je possède une LoginActivity
où l'utilisateur peut s'inscrire ou se connecter avec les informations d'identification existantes. Je ne veux pas que FirebaseInstanceIdService
génère un jeton, sauf si l'utilisateur est connecté et que MainActivity
de l'application est lancé.
Je vous remercie
Vous ne pouvez pas bloquer l'appel de FirebaseInstanceIdService.onTokenRefresh()
tant que l'utilisateur n'est pas connecté.
Ce que vous pourriez faire dans votre cas d'utilisation est:
FirebaseInstanceIdService.onTokenRefresh()
, ignorez l'événement si l'utilisateur n'est pas connecté.FirebaseInstanceId.getToken()
et si != null
appelez onTokenRefresh()
(ou directement votre logique) manuellement.De cette manière, vous pouvez traiter le jeton lorsque l'utilisateur est connecté. Si le jeton n'est pas disponible (ou est tourné), l'événement onTokenRefresh()
sera envoyé ultérieurement.
Mise à jour (3 juillet 2017) : dans les commentaires, un lecteur a rappelé qu'il était possible d'appeler FirebaseInstanceIdService.onTokenRefresh()
après la connexion de l'utilisateur.
C'est juste. Lorsque l'utilisateur se connecte, getToken()
peut toujours renvoyer null
si onTokenRefresh()
n'a pas été appelé auparavant.
Vous devez régler cette affaire dans votre application. Très probablement, l'utilisateur peut utiliser l'application de toute façon, mais vous ne pouvez pas envoyer de notification Push tant que vous n'avez pas reçu le jeton.
Lorsque onTokenRefresh()
est finalement appelé, si l'utilisateur se connecte avant, vous pouvez associer le jeton à l'utilisateur.
Désolé mais ce n'est pas possible. FirebaseInstanceIdService
appelle automatiquement au démarrage de l'application et génère une Token
. N'oubliez pas que sa relation avec l'application Instance
. Pas avec l'utilisateur en particulier. Si vous essayez de sauvegarder Token
avec un utilisateur particulier (c.-à-d. Lorsque l'utilisateur sera connecté, vous sauvegarderez cette token
dans la base de données du serveur pour la notification Push de cet utilisateur). Si vous faites cela, vous rencontrerez un bugDeux utilisateur partage une application Instance
puis la notification push peut être poussée vers le mauvais utilisateur .. J'espère que vous comprenez mon point.
Je maintiens un indicateur dans la préfecture partagée qui indique si le jeton gcm est envoyé au serveur ou non. Dans l'écran de démarrage chaque fois que j'appelle une méthode sendDevicetokenToServer. Cette méthode vérifie si l'ID utilisateur n'est pas vide et que gcm send status envoie ensuite le jeton au serveur.
public static void sendRegistrationToServer(final Context context) {
if(Common.getBooleanPerf(context,Constants.isTokenSentToServer,false) ||
Common.getStringPref(context,Constants.userId,"").isEmpty()){
return;
}
String token = FirebaseInstanceId.getInstance().getToken();
String userId = Common.getUserId(context);
if(!userId.isEmpty()) {
HashMap<String, Object> reqJson = new HashMap<>();
reqJson.put("deviceToken", token);
ApiInterface apiService =
ApiClient.getClient().create(ApiInterface.class);
Call<JsonElement> call = apiService.updateDeviceToken(reqJson,Common.getUserId(context),Common.getAccessToken(context));
call.enqueue(new Callback<JsonElement>() {
@Override
public void onResponse(Call<JsonElement> call, Response<JsonElement> serverResponse) {
try {
JsonElement jsonElement = serverResponse.body();
JSONObject response = new JSONObject(jsonElement.toString());
if(context == null ){
return;
}
if(response.getString(Constants.statusCode).equalsIgnoreCase(Constants.responseStatusSuccess)) {
Common.saveBooleanPref(context,Constants.isTokenSentToServer,true);
}
}catch (Exception e){
e.printStackTrace();
}
}
@Override
public void onFailure(Call<JsonElement> call, Throwable throwable) {
Log.d("", "RetroFit2.0 :getAppVersion: " + "eroorrrrrrrrrrrr");
Log.e("eroooooooorr", throwable.toString());
}
});
}
}
Dans la classe MyFirebaseInstanceIDService
@Override
public void onTokenRefresh() {
// Get updated InstanceID token.
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d(TAG, "Refreshed token: " + refreshedToken);
// If you want to send messages to this application instance or
// manage this apps subscriptions on the server side, send the
// Instance ID token to your app server.
Common.saveBooleanPref(this,Constants.isTokenSentToServer,false);
Common.sendRegistrationToServer(this);
}