如何在触发特定活动后启动FCM ID服务?

时间:2016-05-30 03:35:31

标签: android google-cloud-messaging firebase-cloud-messaging

假设我有LoginActivity,用户可以使用现有凭据注册或登录。除非用户已登录并且已启动应用程序的FirebaseInstanceIdService,否则我不希望MainActivity生成令牌。

谢谢

3 个答案:

答案 0 :(得分:16)

在用户登录之前,您无法阻止FirebaseInstanceIdService.onTokenRefresh()被阻止。

您在用例中可以做的是:

  • 如果用户未登录,则FirebaseInstanceIdService.onTokenRefresh()忽略该事件
  • 当用户登录时检查FirebaseInstanceId.getToken()以及!= null是否手动调用onTokenRefresh()(或直接调用您的逻辑)。

通过这种方式,您可以在用户登录时处理令牌,如果令牌不可用(或已轮换),您将在稍后收到onTokenRefresh()事件。

更新(2017年7月3日):在评论中,读者提醒用户登录后可以调用FirebaseInstanceIdService.onTokenRefresh()

这是对的。当用户登录时,如果之前未调用getToken(),则null仍可返回onTokenRefresh()

您需要在自己的应用中使用此案例。最有可能的是,用户无论如何都可以使用该应用,但在收到令牌之前,您无法发送推送通知。

最后调用onTokenRefresh()时,如果用户之前登录,则可以将该令牌与用户关联。

答案 1 :(得分:3)

抱歉,但这是不可能的。 FirebaseInstanceIdService会在应用程序启动时自动调用并生成Token。请记住,它与应用程序Instance有关。不是与一个特定的用户。如果您尝试使用一个特定用户保存Token(即,当用户登录时,您将在服务器数据库中保存token以获取该用户的推送通知)。如果您这样做是一个错误,未来将面临的是,如果两个用户共享一个应用程序Instance,那么推送通知可能会被推送给错误的用户.. 希望你明白我的观点。

答案 2 :(得分:0)

我在共享pref中维护一个标志,指示gcm令牌是否发送到服务器。每次我调用一个方法sendDevicetokenToServer时,在Splash屏幕中。此方法检查用户标识是否为空并且gcm发送状态,然后将令牌发送到服务器。

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

    }

}

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

}