返回的规范 ID 给我 MismatchSenderId
Returned canonical ID gives me MismatchSenderId
我正在开发一个应用程序,它使用两个不同的 SDK(A 和 B),每个 SDK 都想使用 GCM 向设备发送推送通知。我还负责 SDK A。主要问题是,一段时间后,A 的推送通知不再到达设备,我不知道为什么。
我们怀疑,它与以下问题有关:目前,SDK A 成功使用已弃用的 gcm.register(senderID)
方法检索其 registrationID
。 B 使用推荐的方式 instanceID.getToken(SenderId, GoogleCloudMessaging.INSTANCE_ID_SCOPE, null)
来获取它的 registrationID(也称为 push token)。所有这一切都很好。我得到两个不同的令牌,推送通知到达。
A 的注册 ID 如下所示APA91bFRLo_AqvWY9M6Xqc_s2pqxS09LhpSd0pO3...
B的注册ID是这样的dxhUcxJ-IpE:APA91bHG19a107E6DU_iGPCZm0mjd7FBH5ciGgtG...
当我尝试使用 curl 手动发送 SDK A 的推送通知时(如 here),推送通知到达设备并调用 returns:
{
"multicast_id":7932847...,
"success":1,
"failure":0,
"canonical_ids":1,
"results":
[{"registration_id":"dxhUcxJ-IpE:APA91bHG19a107E6DU_iGPCZm0mjd4F..."}]
}
据我从 Google 文档中了解到,这意味着对于所有进一步的调用,我应该将 A 中的当前 registrationID 替换为结果数组中返回的那个。关键是,规范 ID 与 SDK B 的注册 ID 完全匹配。当我现在尝试使用 "canonical-ID"、服务器 returns "error":"MismatchSenderId"
对 SDK A 执行相同的 curl 调用时。
这是有道理的,因为只有 SDK B 注册了这个 registrationID。谁能解释一下,为什么我仍然得到这个规范 ID,我是否应该使用它,以及是否有人在集成两个 Push-SDK 时遇到过类似的问题?
提前致谢
使用 2 个不同的 SDK 没有错。
SDK A这里使用的是不推荐的方式gcm.register(senderID)。 Google 推荐使用 Instance Id API 的原因之一是,此 API 提供了一个侦听器,用于侦听任何令牌刷新并请求您的应用程序刷新其令牌。这将确保您的应用始终拥有最新的令牌。
现在使用 SDK A,您将使用旧的注册令牌进行推送,它可以工作,但最终会在 GCM 从其服务器中删除旧令牌时停止工作。
使用 SDK B,您拥有最新的令牌。
发送推送通知后,您将在响应中获得最新的注册令牌,即 canonical id。您的服务器端应使用此规范 ID 更新旧注册令牌。
为什么会出现 MismatchSenderId 错误:
A registration token is tied to a certain group of senders. When a client app registers for GCM, it must specify which senders are allowed to send messages. You should use one of those sender IDs when sending messages to the client app. If you switch to a different sender, the existing registration tokens won't work.
我想,SDK A 和 SDK B 有自己的发件人 ID,这解释了为什么返回的令牌不适用于 SDK A。
解决方法:-
- 对于 SDK A,当您将获得可用于推送的最新令牌时,尝试再次注册该设备。
- 更好的是,实施实例 ID API
我正在开发一个应用程序,它使用两个不同的 SDK(A 和 B),每个 SDK 都想使用 GCM 向设备发送推送通知。我还负责 SDK A。主要问题是,一段时间后,A 的推送通知不再到达设备,我不知道为什么。
我们怀疑,它与以下问题有关:目前,SDK A 成功使用已弃用的 gcm.register(senderID)
方法检索其 registrationID
。 B 使用推荐的方式 instanceID.getToken(SenderId, GoogleCloudMessaging.INSTANCE_ID_SCOPE, null)
来获取它的 registrationID(也称为 push token)。所有这一切都很好。我得到两个不同的令牌,推送通知到达。
A 的注册 ID 如下所示APA91bFRLo_AqvWY9M6Xqc_s2pqxS09LhpSd0pO3...
B的注册ID是这样的dxhUcxJ-IpE:APA91bHG19a107E6DU_iGPCZm0mjd7FBH5ciGgtG...
当我尝试使用 curl 手动发送 SDK A 的推送通知时(如 here),推送通知到达设备并调用 returns:
{
"multicast_id":7932847...,
"success":1,
"failure":0,
"canonical_ids":1,
"results":
[{"registration_id":"dxhUcxJ-IpE:APA91bHG19a107E6DU_iGPCZm0mjd4F..."}]
}
据我从 Google 文档中了解到,这意味着对于所有进一步的调用,我应该将 A 中的当前 registrationID 替换为结果数组中返回的那个。关键是,规范 ID 与 SDK B 的注册 ID 完全匹配。当我现在尝试使用 "canonical-ID"、服务器 returns "error":"MismatchSenderId"
对 SDK A 执行相同的 curl 调用时。
这是有道理的,因为只有 SDK B 注册了这个 registrationID。谁能解释一下,为什么我仍然得到这个规范 ID,我是否应该使用它,以及是否有人在集成两个 Push-SDK 时遇到过类似的问题?
提前致谢
使用 2 个不同的 SDK 没有错。
SDK A这里使用的是不推荐的方式gcm.register(senderID)。 Google 推荐使用 Instance Id API 的原因之一是,此 API 提供了一个侦听器,用于侦听任何令牌刷新并请求您的应用程序刷新其令牌。这将确保您的应用始终拥有最新的令牌。
现在使用 SDK A,您将使用旧的注册令牌进行推送,它可以工作,但最终会在 GCM 从其服务器中删除旧令牌时停止工作。 使用 SDK B,您拥有最新的令牌。
发送推送通知后,您将在响应中获得最新的注册令牌,即 canonical id。您的服务器端应使用此规范 ID 更新旧注册令牌。
为什么会出现 MismatchSenderId 错误:
A registration token is tied to a certain group of senders. When a client app registers for GCM, it must specify which senders are allowed to send messages. You should use one of those sender IDs when sending messages to the client app. If you switch to a different sender, the existing registration tokens won't work.
我想,SDK A 和 SDK B 有自己的发件人 ID,这解释了为什么返回的令牌不适用于 SDK A。
解决方法:-
- 对于 SDK A,当您将获得可用于推送的最新令牌时,尝试再次注册该设备。
- 更好的是,实施实例 ID API