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

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

谢谢

Solutions Collecting From Web of "只有在特定活动被触发后,如何启动FCM ID服务?"

您不能阻止FirebaseInstanceIdService.onTokenRefresh()被调用,直到用户login。

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

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

通过这种方式,您可以在用户login时处理令牌,并且如果令牌不可用(或旋转),稍后您将收到onTokenRefresh()事件。

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

这是对的。 当用户login时,如果onTokenRefresh()没有调用onTokenRefresh()仍然可以返回null

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

onTokenRefresh()最终被调用时,如果用户之前login,则可以将该令牌与用户相关联。

对不起,但这是不可能的。 FirebaseInstanceIdService在应用程序启动时自动调用并生成一个Token 。 请记住,它与应用程序Instance相关。 不与一个特定的用户。 如果你试图用一个特定的用户来保存Token (例如,当用户login时,那么你将把这个token保存在服务器数据库中,以便推送该用户的通知)。如果你这样做,将来你将面临的错误是,如果用户共享一个应用程序Instance然后推送通知可能被推送到错误的用户..希望你明白我的观点。

我在共享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); }