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

问题描述 投票:1回答:5

我在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,以便我们的服务器可以相应地更新。

android ios google-cloud-messaging firebase-cloud-messaging
5个回答
1
投票

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

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

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


1
投票

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

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


1
投票

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

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

因此,如果您只迁移和存储新的fcm标记,它将起作用,它对我有用。


1
投票

这就是我做的....我在SharedPreference中保存oldToken并从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();
    }

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消息。为了清楚起见,我没有测试过这个!

© www.soinside.com 2019 - 2024. All rights reserved.