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

时间:2016-07-12 23:47:05

标签: android mysql firebase firebase-cloud-messaging

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

我刚刚实施了FCM,服务生成token 之前用户已经看过任何这些页面。我怎样才能使服务之后运行 <{strong>到达MainActivity

问题是我正在尝试将令牌刷新到MySQL DB到相应的用户帐户,但由于用户尚未登录,因此{{1}我的服务器消息失败了。设计这个有什么好办法?我想在null中保存令牌并在用户登录后将其发送到服务器但是在稍后刷新令牌时会产生许多复杂情况?!

可能的解决方案

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

4 个答案:

答案 0 :(得分:14)

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

FirebaseInstanceID.getInstance().getToken();

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

答案 1 :(得分: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
   }
}

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

答案 2 :(得分:6)

我们这样处理:

  1. 我们的服务器根据用户ID(主键)
  2. 创建/更新令牌值
  3. 使用2个SharedPreferences
    1. 字符串 - 令牌字符串
    2. 布尔值(已更新) - 是否在服务器上更新令牌。
  4. 如果是令牌刷新,我们更新令牌字符串并将布尔值设置为false。 之后每当用户登录时我们都会检查布尔值(更新),如果这是假的 - 我们将当前令牌附加到他的id并将其发送到服务器并将更新设置为true。

答案 3 :(得分:0)

2020年12月更新::使用新的Firebase SDK(21.0.0),您可以通过覆盖onNewToken()方法来获取它:

@Override
public void onNewToken(@NonNull String s) {
    super.onNewToken(s);
    sendRegistrationToServer(s);
}

或在您的范围内按FirebaseInstallations.getInstance()

FirebaseInstallations.getInstance().getToken(false).addOnCompleteListener(new OnCompleteListener<InstallationTokenResult>() {
          @Override
          public void onComplete(@NonNull Task<InstallationTokenResult> task) {
              if(!task.isSuccessful()){
                  return;
              }
              // Get new Instance ID token
              String token = task.getResult().getToken();

          }
      });