我正在开发一个应用程序,它使用两个不同的SDK(A和B),其中每个SDK都希望使用GCM向设备发送推送通知。我也负责SDK A.主要问题是,经过一段时间后,A的推送通知不再到达设备,我不知道为什么。
我们怀疑它与以下问题有关:目前,SDK A成功使用已弃用的gcm.register(senderID)
方法来检索其registrationID
。 B使用instanceID.getToken(SenderId, GoogleCloudMessaging.INSTANCE_ID_SCOPE, null)
的推荐方式获取其registrationID(也称为推送令牌)。所有这一切都很好。我得到两个不同的令牌并推送通知到达。
A的注册ID看起来像APA91bFRLo_AqvWY9M6Xqc_s2pqxS09LhpSd0pO3...
B的注册ID,如dxhUcxJ-IpE:APA91bHG19a107E6DU_iGPCZm0mjd7FBH5ciGgtG...
当我尝试使用curl手动发送SDK A的推送通知时(如here),推送通知到达设备并且呼叫返回:
{
"multicast_id":7932847...,
"success":1,
"failure":0,
"canonical_ids":1,
"results":
[{"registration_id":"dxhUcxJ-IpE:APA91bHG19a107E6DU_iGPCZm0mjd4F..."}]
}
据我在Google文档中所理解,这意味着对于所有进一步的调用,我应该将当前的注册ID替换为结果数组中返回的注册ID。关键是,规范id完全匹配SDK B的registrationID。当我现在尝试使用" canonical-ID"执行相同的SDK A卷曲调用时,服务器返回"error":"MismatchSenderId"
这是有道理的,因为只有SDK B注册了此registrationID。任何人都可以解释一下,为什么我仍然会得到这个规范ID,我是否应该使用它,如果有人在集成两个Push-SDK时遇到类似的问题?
提前致谢
答案 0 :(得分:0)
使用2个不同的SDK没有任何问题。
SDK A这里使用的是非推荐方法gcm.register(senderID)。 Google建议使用Instance Id API的原因之一是,此API提供了一个侦听器,可以侦听您的应用刷新其令牌的任何令牌刷新和请求。这将确保您的应用始终拥有最新的令牌。
现在使用SDK A,您正在使用旧的注册令牌,这将起作用,但最终将在GCM从其服务器中删除旧令牌时停止工作。 使用SDK B,您拥有最新的令牌。
发送推送通知后,您将在响应中收到称为canonical id的最新注册令牌。您的服务器端应使用此规范ID更新旧的注册令牌。
为什么会出现MismatchSenderId错误:
注册令牌与某组发件人绑定。当客户端应用程序注册GCM时,它必须指定允许哪些发件人发送消息。在向客户端应用程序发送消息时,您应该使用其中一个发件人ID。如果您切换到其他发件人,现有的注册令牌将无效。
我认为,SDK A和SDK B有自己的发件人ID,这解释了返回令牌不适用于SDK A的原因。
解决方法: -