【问题标题】:Migration from GCM to FCM. New token generated on device but old still seems to be valid从 GCM 迁移到 FCM。在设备上生成新令牌但旧令牌似乎仍然有效
【发布时间】:2016-12-28 11:46:49
【问题描述】:

我对在 FCM(或以前的 GCM)中生成的令牌有疑问。

我们刚刚在我们的 Android 应用中从 GCM 迁移到 FCM,所有用户似乎都会在更新后的应用启动时获得一个新令牌。 这会导致一些麻烦,因为我们将令牌存储在我们的服务器上以供用户使用所有设备,并且由于我们在迁移时获得了新令牌,因此将其存储为该特定用户的新设备。

问题在于旧的 GCM 令牌似乎仍然有效,并且所有用户现在都在同一设备上收到双重推送通知。

这是一个用例:

  1. 用户在 1 部手机和 1 台平板电脑上安装了应用程序(应用程序的 GCM 版本) 服务器现在包含用户的这些令牌:

平板电脑:evWLQAq2yXw:APA91bH4GlHPSi[...]

电话:fnLVyZy_ICE:APA91bHopxcL1ckHl[...]

  1. 用户在手机上升级到新版本(生成新令牌的应用程序的 FCM 版本) 服务器现在包含用户的这些令牌:

平板电脑:evWLQAq2yXw:APA91bH4GlHPSi[...]

电话:fnLVyZy_ICE:APA91bHopxcL1ckHl[...]

电话:fnLVyZy_ICE:CTVj02MDxjZq7rIYSi[...]

  1. 服务器推送通知,用户现在在平板电脑上收到 1 个通知,在手机上收到 2 个通知。

应该如何处理?我不可能是唯一一个遇到这个问题的人

当我从我们的服务器向 FCM (https://fcm.googleapis.com/fcm/send) 发布通知时,我从谷歌得到的响应是这样的:

{
  "multicast_id": 8013823232923765460,
  "success": 1,
  "failure": 0,
  "canonical_ids": 0,
  "results": [
    {
      "message_id": "0:1482923896059583%2bb227d2f9fd7ecd"
    }
  ]
}

上述回复适用于旧 GCM 令牌和发布的新 FCM 令牌。响应中没有设置错误或 canonical_ids,以便我们的服务器可以相应地更新。

【问题讨论】:

  • 我想知道您为什么要为一台设备保留多个令牌。确实,即使更新了令牌,旧令牌也会在一段时间内有效。但在我看来,您可以更新设备令牌而不是跟踪令牌,对吧?
  • 我们为用户保存多个令牌的原因是他或她可能在多个设备上拥有该应用程序@AkramShokri。当服务器发送推送并从 GCM/FCM 获取无效令牌时,它将从数据库中删除它。我确信 GCM 生成的一个会在用户在 FCM 中生成一个新的之后在第一次推送时返回无效,但事实并非如此。
  • 你解决过这个问题吗?我们有同样的问题。我们将 GCM 表单更新为 FCM,但我们也更改了 google 项目,现在旧项目上的旧 GCM 令牌似乎仍然有效。
  • @Xzya。我们还没有以适当的方式解决这个问题。我们现在已经完成了一个解决方法,我们比较冒号 (:) 之前的令牌的第一部分,用于用户的新令牌和旧令牌,如果第一部分相同,则删除旧令牌。这是一个我不喜欢的丑陋的解决方法,并且在任何地方都没有记录它总是有效的,但是我们看到了这个“模式”并且现在就去做了。仍在为此寻找合适的解决方案..

标签: android ios google-cloud-messaging firebase-cloud-messaging


【解决方案1】:

您可以在客户端(应用程序)上设置逻辑来发送旧令牌和新令牌,以便您可以在服务器数据库中进行更新。

FCM 令牌有时会刷新,即使这样,旧令牌也会在一段时间内有效。

我们已经为网络通知实现了这个,它工作正常。

【讨论】:

    【解决方案2】:

    您不是唯一遇到这种情况的人。我也遇到了同样的问题,其中 1 个设备有 2 个有效的通知 ID(1 个来自 GCM,1 个来自 FCM)。用户将收到双重通知。

    我这样做的一种方法是通过检查我自己的应用程序设置中的一些默认参数来检测全新安装。这将取决于应用程序,并且可能不是万无一失的。

    【讨论】:

      【解决方案3】:

      实际上,您不必存储 gcm 令牌,只需存储 fcm 令牌即可。

      FCM 仍然与 GCM 兼​​容,因为它是它的核心。因此,在发送通知时切换到 FCM 端点 (https://fcm.googleapis.com/fcm/send) 仍然适用于具有 GCM 的应用版本。无需编写单独的程序。

      因此,如果您仅迁移和存储新的 fcm 令牌,它就可以工作并且对我有用。

      【讨论】:

        【解决方案4】:

        这就是我所做的...... 我将 oldToken 保存在 SharedPreference 中,并从 Firebase 获取了 newToken 基本上,如果 oldToken 与 newToken 不同,则使用 GCM 将其删除 可能需要对初始升级版本执行此操作,然后在您的大多数用户使用新应用版本后删除此代码。

        if (oldToken != null && !oldToken.equals(newToken) && newToken != null) {
                //Lets Delete the old Token, this is a blocking call and needs to happen in another thread
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            com.google.android.gms.iid.InstanceID.getInstance(PMApplication.getContext()).deleteInstanceID();
                        } catch (IOException e) {
                            //Nothing can be done, in this case we have to live with 2 tokens and 2 messages
                        }
                    }
                }).start();
            }
        

        【讨论】:

          【解决方案5】:

          从 GCM 到 FCM 的迁移指南:

          FCM SDK 会自动添加所有必需的权限以及必需的接收器功能。请务必从您的应用清单中删除以下过时(并且可能有害,因为它们可能会导致消息重复)元素:

          <uses-permission android:name="android.permission.WAKE_LOCK" />
          <permission android:name="<your-package-name>.permission.C2D_MESSAGE"
                      android:protectionLevel="signature" />
          <uses-permission android:name="<your-package-name>.permission.C2D_MESSAGE" />
          
          ...
          
          <receiver
              android:name="com.google.android.gms.gcm.GcmReceiver"
              android:exported="true"
              android:permission="com.google.android.c2dm.permission.SEND" >
              <intent-filter>
                  <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                  <category android:name="com.example.gcm" />
              </intent-filter>
          </receiver>
          

          如果我理解正确,删除清单中的这些权限就足够了。通过这样做,将不再接收 GCM 消息。澄清一下,我没有测试这个!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-04-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多