我们正在切换通知基础架构,以使用Instance ID API使用新的GCM 3.0注册机制。以前我们使用GCMRegistrar.register()方法使用旧机制。
我们遇到的问题是,我们注意到如果设备已在旧GCMRegistrar中注册,在更新并注册新的Instance ID API后,两个注册令牌都有效并且可以接收通知。
我希望停用旧的注册令牌,并且我们的推送服务器在向旧令牌发送通知时会收到规范的注册ID(如此处所述GCM registering with two different working registration ids),尤其是应用程序版本已更改,但这种情况似乎并非如此发生。
这是GCM的正确行为吗?我们有什么方法可以在推送服务器上检测到设备收到了新令牌(没有从应用程序取消注册)?
答案 0 :(得分:3)
我终于收到了Google支持部门关于我的问题的答复。事实证明这是预期的行为:
由于需要支持向后兼容,您观察到的是预期的行为 注册ID。
我们建议您从gcmregistrar()中标记旧的注册ID,并且一旦从getToken()获得注册令牌,就不要再使用它来发送。 (我相信你可能已经实施了一个检测这种方法的解决方案)
我们的解决方案是在注册新用户之前简单地从推送服务器中删除旧的注册令牌。
我们没有使用GCMRegistrar.unregister(),因为我们观察到它能够取消注册新的令牌(通过getToken()获得)。
<强>更新强>
我只想向对此主题感兴趣的任何人提供快速更新。
似乎这个问题已得到解决,因为我们最近测试了我们的注册机制,结果发现新的GCM令牌取代(和取消注册)旧令牌。
答案 1 :(得分:0)
注册令牌甚至可能在某些情况下发生变化。虽然cononical注册ID也是一个好主意。使用tokenRefresh
,如图所示here。
@Override
public void onTokenRefresh() {
// Fetch updated Instance ID token and notify our app's server of any changes (if applicable).
Intent intent = new Intent(this, RegistrationIntentService.class);
startService(intent);
}
建议基于此行“在method reference中需要进行密钥轮换和处理特殊情况”。