我在FCM(或以前GCM)中生成的令牌有问题。
我们刚刚在Android应用中从GCM迁移到FCM,所有用户似乎都在更新后在应用程序开始生成了新的令牌。这会导致SOM麻烦,因为我们将令牌存储在服务器上的用户所有设备上,并且由于我们在迁移时获得了新的令牌,因此将其作为该特定用户的新设备存储。
问题是旧的GCM令牌似乎仍然有效,所有用户现在都在同一设备上收到双重推送通知。
这是一个用例:
- 用户将应用程序安装在1个手机和1平板电脑上(GCM版本的应用程序)服务器现在为用户包含这些令牌:
平板电脑:evwlqaq2yxw:apa91bh4glhpsi [...]
电话: fnlvyzy_ice :apa91bhopxcl1ckhl [...]
- 用户升级到电话上的新版本(FCM版本的应用程序生成新令牌)服务器现在为用户包含这些令牌:
平板电脑: evwlqaq2yxw :apa91bh4glhpsi [...]
电话: fnlvyzy_ice :apa91bhopxcl1ckhl [...]
电话: fnlvyzy_ice :ctvj02mdxjzq7riysi [...]
- 服务器推开通知,用户现在在平板电脑上收到1个通知,在电话上获得2个通知。
应该如何处理?我不能是唯一一个有这个问题的人
在将服务器从我们的服务器发布到FCM(https://fcm.googleapis.com/fcm/send)时,我从Google获得的响应是:
{
"multicast_id": 8013823232923765460,
"success": 1,
"failure": 0,
"canonical_ids": 0,
"results": [
{
"message_id": "0:1482923896059583%2bb227d2f9fd7ecd"
}
]
}
上面的响应适用于旧的GCM令牌和发布的新FCM令牌。响应中没有错误或canonical_ids设置,以便我们的服务器可以相应更新。
您可以在客户端(应用程序)上具有逻辑来发送旧令牌和新令牌,以便您可以在服务器数据库中进行更新。
fcm令牌有时会得到刷新,即使这样,旧令牌也有效。
我们已经为Web通知实施了此功能,并且效果很好。
您不是唯一一个经历此的人。我也遇到了同样的问题,其中有2个有效的通知ID(1个来自GCM,1个来自FCM的1个设备)。用户将获得双重通知。
我这样做的一种方法是通过检查自己的应用程序安装中的一些默认参数来检测新的安装。这将是依赖于应用程序的,并且可能不会愚蠢。
实际上,您不必存储GCM令牌,只需存储FCM令牌即可。
FCM仍然与GCM兼容,因为它的核心是。因此,在发送通知时,切换到FCM端点(https://fcm.googleapis.com/fcm/send)仍适用于具有GCM的应用程序版本。无需编写单独的程序。
因此,如果您仅迁移和存储新的FCM令牌,它将起作用,并且对我有用。
这是我所做的。我在SharedPreference中保存了老式,并从Firebase那里获得了纽约语基本上,如果老式与纽约语不同,请使用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();
}
从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消息将不再收到。只是要清楚,我没有测试!