Firebase FCM令牌 - 何时发送到服务器?

iBo*_*obb 17 mysql android firebase firebase-cloud-messaging

好的,所以我有一个应用程序,在第一次启动时将带您浏览一些欢迎幻灯片,然后将您带到登录/注册页面然后转到MainActivity.

我刚刚实现FCM,并且服务在用户看到任何这些页面token 之前生成.我怎么能这样做,以便我到达服务运行MainActivity

问题是我正在尝试将令牌刷新到MySQL DB相应的用户帐户后立即发送,但由于用户尚未登录,这就是null我向服务器发送的消息失败.设计这个有什么好办法?我想SharedPreferences在用户登录后保存令牌并将其发送到服务器但是在稍后刷新令牌时会产生很多复杂因素?!

可能的方法:

我不确定我是否完全理解这两个服务是如何运行的但是onTokenRefresh我只是将令牌保存到SharedPreferencesMainActivity中并从MainActivity中获取值SP,然后将其发送到服务器.在这种情况下,当刷新令牌时,新值将立即SharedPreferences再次进入.但我仍然需要检查它是否是SP中的新值,然后将其重新上载到服务器.这令人困惑!

Art*_*son 14

请注意,您始终可以使用以下方法检索令牌:

FirebaseInstanceID.getInstance().getToken();
Run Code Online (Sandbox Code Playgroud)

null如果尚未生成令牌,则返回此选项; 如果已生成令牌,则返回该令牌.在您的情况下,很可能在用户登录时生成令牌.因此,您应该能够在用户登录后立即将其发送到您的应用服务器.如果它不可用,那么您会像Chintan Soni提到的那样在onTokenRefresh回调中发送它.


Chi*_*oni 10

是自动生成FCM令牌.但试着以不同的角度看待这一点.

这就是我处理它的方式.

让FCM在您的应用启动后立即生成令牌.将调用OnTokenRefresh,您只需将其保存在您的首选项中:

@Override
public void onTokenRefresh() {
    // Get updated InstanceID token.
    String refreshedToken = FirebaseInstanceId.getInstance().getToken();
    Log.d(TAG, "Refreshed token: " + refreshedToken);

    sendRegistrationToServer(refreshedToken);
}

private void sendRegistrationToServer(String token) {
    // Add custom implementation, as needed.
    SharedPreferenceUtils.getInstance(this).setValue(getString(R.string.firebase_cloud_messaging_token), token);

   // To implement: Only if user is registered, i.e. UserId is available in preference, update token on server.
   int userId = SharedPreferenceUtils.getInstance(this).getIntValue(getString(R.string.user_id), 0);
   if(userId != 0){
       // Implement code to update registration token to server
   }
}
Run Code Online (Sandbox Code Playgroud)

希望你顺便说一句.询问您是否需要更多许可.


His*_*eer 6

我们像这样处理它:

  1. 我们的服务器根据用户ID(主键)创建/更新令牌值
  2. 使用2个SharedPreferences
    1. String - 令牌字符串
    2. 布尔值(已更新) - 是否在服务器上更新令牌.

在令牌刷新的情况下,我们更新令牌字符串并将布尔值设置为false.之后每当用户登录时我们都会检查boolean(更新),如果是false,我们将当前令牌附加到他的id并将其发送到服务器并将更新设置为true.