web-dev-qa-db-fra.com

Comment lancer le service d'identification FCM uniquement après le déclenchement d'une activité particulière?

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

11
Bravo

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:

  • Dans FirebaseInstanceIdService.onTokenRefresh(), ignorez l'événement si l'utilisateur n'est pas connecté.
  • Lorsque l'utilisateur se connecte, vérifiez 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.

16
Diego Giorgini

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. 

3
Usman lqbal

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);

}
0
Prashanth Debbadwar