从GCM迁移到FCM。在设备上生成但旧的令牌似乎仍然有效

时间:2016-12-28 11:46:50

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

我在FCM(或之前的GCM)中生成的令牌存在问题。

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

问题是旧的GCM令牌似乎仍然有效,所有用户现在都会收到同一设备的双推通知..

以下是一个用例:

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

    电话: fnLVyZy_ICE :APA91bHopxcL1ckHl [...]

    1. 用户升级到手机上的新版本(生成新令牌的应用的FCM版本) 服务器现在包含用户的这些令牌:
    2. 平板电脑: evWLQAq2yXw :APA91bH4GlHPSi [...]

      电话: fnLVyZy_ICE :APA91bHopxcL1ckHl [...]

      电话: fnLVyZy_ICE :CTVj02MDxjZq7rIYSi [...]

      1. 服务器推送通知,用户现在在平板电脑上获得1个通知,在手机上获得2个通知。
      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,因此我们的服务器可能会相应更新。

5 个答案:

答案 0 :(得分:1)

您可以让客户端(app)上的逻辑发送旧令牌和新令牌,以便您可以在服务器数据库中进行更新。

FCM令牌有时会刷新,即使这样,旧令牌也会有效。

我们已经为网络通知实施了此功能,并且工作正常。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

实际上,您不必存储gcm标记,只需存储fcm标记。

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

因此,如果您只迁移和存储新的fcm令牌,它将起作用并且它对我有效。

答案 3 :(得分:1)

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

Uri uri = new Uri("https://example.com/?var=a%3Ab%3Dc%26d%3Fe");
var original = uri.OriginalString;
var toString = uri.ToString();

答案 4 :(得分:0)

从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消息。为了清楚起见,我没有对此进行测试!