我们一直致力于GCM实施,并注意到即使卸载了应用程序,分配给应用程序安装的设备地址也可以继续使用.
因此,我们安装了一个应用程序,获得令牌A,设备订阅了特定的警报类型1,消息令牌A非常成功.然后我们卸载应用程序.
不,我们重新安装,接收令牌B,并且设备订阅了特定的警报类型2,我们向令牌B发送消息非常成功.
现在,由于我们在卸载和重新安装应用程序之间没有向令牌A发送消息,因此我们仍然可以向两个令牌发送消息,并且应用程序同时接收它们.
如果我们尝试在卸载应用程序时向令牌A发送消息,我们可以从谷歌的响应中清除它.
有没有办法知道令牌A在技术上不再有效?
我在GCM中使用GoogleCloudMessaging.getInstance(context)注册; 并将收到的令牌保存在设备上.然后将其发送到服务器,它与用户帐户相关联.如果我卸载我的应用程序而没有注销并再次安装并与其他用户一起登录,我会收到新令牌并将其发送到服务器.当推送发送给第一个用户时,我在第二个用户登录时看到它们.
为什么GCM会向我发送不同的令牌,我该如何处理?
在Android设备上注册/取消注册GCM消息时,我注意到了一些奇怪的行为.从客户端设备的角度观察以下用例:
如果在步骤2之后,服务器尝试向ID A发送消息,则会收到NotRegistered错误,如记录和预期的那样.
但是,现在的怪部分:第3步之后,两者 ID 一个和乙是有效的ID!两个ID都将触发设备上的Intent接收器,从而向应用程序发送两条消息.
这种行为是否已经过了,或者我做错了什么?
这是我注册和取消注册的代码,从onCreate()我的应用程序上的第一个活动启动时触发:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
unregister(getApplicationContext());
register(getApplicationContext());
}
/** Registers this device for GCM messages */
public static void register(Context context) {
GCMRegistrar.checkDevice(context);
GCMRegistrar.checkManifest(context);
String regId = GCMRegistrar.getRegistrationId(context);
if (regId.equals("")) {
GCMRegistrar.register(context, SENDER_ID);
} else {
storeRegId(regId); // Also notifies back-end
}
}
public void unregister(Context context) {
GCMRegistrar.unregister(context);
} …Run Code Online (Sandbox Code Playgroud) 我发现当GCM无法发送下一个推送通知时,GCM会将注册ID标记为删除.
但在我的情况下,我的用户发生了以下情况.
场景:
1)我的用户安装了应用程序,他的设备已在GCM注册.
2)同一用户卸载并立即再次安装应用程序.第二次生成新的注册ID.
3)这两个注册ID存储在我的数据库中.
4)现在这个特定用户正在获得两个推送通知.
现在我有以下问题:
问题:
我们最近为推送通知应用程序设置了GCM.服务器api在Node.js中,所以我使用节点模块node-gcm将通知推送到gcm服务器.
我们注意到有时数据包没有交付给最终用户.在做了一些搜索后,我调整了一些有助于提高可靠性的设置
我将旧设置更改为以下新设置:
delayWhileIdle标志从true到false,
collapseKey到时间而不是'demo'
timeToLive到7200而不是3
我还读到了关于规范id的内容.谷歌的页面 "规范注册ID被定义为您的应用程序请求的最后一次注册的ID.这是服务器在向设备发送消息时应使用的ID."
我在发送消息时记录了结果.结果中的规范id为0.这是什么意思?结果如下:
{
multicast_id: 9180653668551804000,
success: 1,
failure: 0,
canonical_ids: 0,
results: [ { message_id: '0:1415521804106240%0209acc19067cebd' } ]
}
Run Code Online (Sandbox Code Playgroud)
stackoverflow上的帖子建议用规范id替换注册ID.我不知道何时更换以及何时更换.
在我的服务器数据库中,在安装应用程序时请求reg_id,并将其与用户在数据库中的记录一起存储.另外,结果中的message_id和multicast_id等字段是什么?