我已阅读有关 GCM 可能会刷新注册 ID 的文章,没有定期循环。我正在尝试使用推送通知构建应用程序,但不太确定如何处理此类刷新的注册 ID。
我的第一个策略是每次应用启动时请求注册 ID 并将其发送到应用服务器。它看起来工作,但不知何故听起来不对......
这样做可以吗?
我已阅读有关 GCM 可能会刷新注册 ID 的文章,没有定期循环。我正在尝试使用推送通知构建应用程序,但不太确定如何处理此类刷新的注册 ID。
我的第一个策略是每次应用启动时请求注册 ID 并将其发送到应用服务器。它看起来工作,但不知何故听起来不对......
这样做可以吗?
基本上,您应该在主要活动中执行以下操作:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_layout);
GCMRegistrar.checkDevice(this);
GCMRegistrar.checkManifest(this);
final String regId = GCMRegistrar.getRegistrationId(this);
if (regId.equals("")) {
GCMRegistrar.register(this, GCMIntentService.GCM_SENDER_ID);
} else {
Log.v(TAG, "Already registered");
}
}
之后,每当应用收到com.google.android.c2dm.intent.REGISTRATION
带有registration_id
额外内容的意图时,您应该将注册 ID 发送到您的应用服务器。当 Google 定期更新应用的 ID 时,可能会发生这种情况。
您可以通过扩展com.google.android.gcm.GCMBaseIntentService
您自己的实现来实现这一点,例如:
public class GCMIntentService extends GCMBaseIntentService {
// Also known as the "project id".
public static final String GCM_SENDER_ID = "XXXXXXXXXXXXX";
private static final String TAG = "GCMIntentService";
public GCMIntentService() {
super(GCM_SENDER_ID);
}
@Override
protected void onRegistered(Context context, String regId) {
// Send the regId to your server.
}
@Override
protected void onUnregistered(Context context, String regId) {
// Unregister the regId at your server.
}
@Override
protected void onMessage(Context context, Intent msg) {
// Handle the message.
}
@Override
protected void onError(Context context, String errorId) {
// Handle the error.
}
}
有关更多详细信息,我会(重新)阅读编写客户端代码的文档和GCM 文档的高级部分。
希望有帮助!
注册刷新不包含在新的 GCM 库中。
科斯汀·马诺拉切的话
“定期”刷新从未发生,并且注册刷新不包含在新的 GCM 库中。
注册 ID 更改的唯一已知原因是应用程序在升级时收到消息会自动取消注册的旧错误。在修复此错误之前,应用程序在升级后仍然需要调用 register(),并且到目前为止注册 ID 可能会在这种情况下发生变化。显式调用 unregister() 通常也会更改注册 ID。
建议/解决方法是生成您自己的随机标识符,例如保存为共享首选项。在每次应用升级时,您都可以上传标识符和可能的新注册 ID。这也可能有助于跟踪和调试服务器端的升级和注册更改。