首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防火墙FCM令牌-什么时候发送到服务器?

防火墙FCM令牌-什么时候发送到服务器?
EN

Stack Overflow用户
提问于 2016-07-12 23:47:04
回答 4查看 17.3K关注 0票数 18

好的,我有一个应用程序,它首先带你浏览几张欢迎幻灯片,然后带你去登录/注册页面,然后转到MainActivity

我刚刚实现了FCM,服务在之前生成了一个token ,用户已经看到了其中的任何一个页面。如何才能使服务在之后运行,然后到达MainActivity

问题是,一旦令牌刷新到适当的用户帐户,我就会尝试将它发送给MySQL DB,但是由于用户还没有登录,也就是说null和服务器消息都失败了。设计这个的好方法是什么?我想将令牌保存在SharedPreferences中,并在用户登录后发送到服务器,但是当令牌在稍后的某个时候刷新时,会造成许多复杂的问题吗?!

可能的解决方案

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-07-13 06:57:43

是的FCM令牌是自动生成的。但是试着从不同的角度来看待这个问题。

我就是这样处理的。

让FCM在应用程序一开始就生成令牌。将调用OnTokenRefresh,您只需将其保存在首选项中,如下所示:

代码语言:javascript
复制
@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
   }
}

希望你的道路畅通。问问你是否需要更多的许可。

编辑

使用新的Firebase (21.0.0),您需要重写onNewToken()方法而不是onTokenRefresh()

代码语言:javascript
复制
 @Override
public void onNewToken(@NonNull String s) {
    super.onNewToken(s);
    sendRegistrationToServer(s);
}
票数 10
EN

Stack Overflow用户

发布于 2016-07-13 16:03:44

请注意,您始终可以通过以下方式检索令牌:

代码语言:javascript
复制
FirebaseInstanceID.getInstance().getToken();

如果令牌尚未生成,则返回null;如果生成令牌,则返回令牌。在您的示例中,令牌很可能在用户登录时生成。因此,您应该能够将它发送到您的应用服务器,一旦用户已登录。如果它不可用,那么您将在onTokenRefresh回调中发送它,就像Chintan提到的那样。

编辑

使用新的Firebase SDK (21.0.0),您将以这样的方式获得令牌:

代码语言:javascript
复制
 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();

          }
      });

您最好添加一个侦听器,以便更多地处理响应。

票数 14
EN

Stack Overflow用户

发布于 2016-07-13 09:24:04

我们是这样处理的:

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

在令牌刷新的情况下,我们更新令牌字符串并将布尔值设置为false。稍后,每当用户登录时,我们每次检查布尔值(更新),如果这是假的-我们附加当前令牌到他的id,并发送到服务器,并设置更新为真。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38340526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档