11

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

谢谢

4

3 回答 3

16

在用户登录之前,您不能阻止FirebaseInstanceIdService.onTokenRefresh()被呼叫。

你可以在你的用例中做的是:

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

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

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

这是对的。当用户登录时,如果之前没有被调用,getToken()仍然可以返回。nullonTokenRefresh()

您需要在您的应用程序中处理这种情况。用户很可能仍然可以使用该应用程序,但在收到令牌之前您无法发送推送通知。

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

于 2016-05-30T20:28:44.703 回答
3

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

于 2016-06-01T19:07:36.753 回答
0

我在共享首选项中维护一个标志,指示 gcm 令牌是否发送到服务器。每次我调用一种方法 sendDevicetokenToServer 时,在启动画面中。此方法检查用户 id 是否不为空并且 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);

}
于 2016-09-29T12:51:10.103 回答