1

查看 GCM 包附带的 gcm-demo-client 示例应用程序,我注意到使用了以下模式:

GCMRegistrar.checkDevice(this);
GCMRegistrar.checkManifest(this);
final String regId = GCMRegistrar.getRegistrationId(this);
if (regId.equals("")) {
    // Register application with GCM
} else {
    // Device is already registered on GCM, check server.
    if (GCMRegistrar.isRegisteredOnServer(this)) {
        // Skip registration.
    } else {
        // Try to register again on server
    }
}

但是,如果由于某种原因,应用程序先前已成功注册到 GCM 和应用程序服务器,然后成功地从 GCM 注销但没有从应用程序服务器注销,那么应用程序将尝试在应用程序服务器上重新注册而不先注销,正确的?所以模式不应该更像:

GCMRegistrar.checkDevice(this);
GCMRegistrar.checkManifest(this);
final String regId = GCMRegistrar.getRegistrationId(this);
if (regId.equals("")) {
    // Check if device was previously registered with application server
    if (GCMRegistrar.isRegisteredOnServer(this)) {
        // Unregister on application server
    }
    // Register application with GCM
} else {
    // Device is already registered on GCM, check server.
    if (GCMRegistrar.isRegisteredOnServer(this)) {
        // Skip registration.
    } else {
        // Try to register again on server
    }
}
4

1 回答 1

2

您可以这样做,但由于注销是(或应该是)异步事件,您必须触发特殊的注销,然后在完成后向 GCM 注册。

所以像:

if (regId.equals("")) {
    // Check if device was previously registered with application server
    if (GCMRegistrar.isRegisteredOnServer(this)) {
        // Unregister on application server and trigger GCM registration
    } else {
        // Register application with GCM
    }
}

我不确定您是否应该担心,因为如果相同的设备再次注册,因为 GCM 提供的注册 ID 可能相同,这对您的应用程序服务器来说应该没什么大不了的。但是,如果不是下次您发送消息时,GCM 应该通过返回规范的 Id为您解决问题。

如果您先从应用程序服务器成功注销,您也只能从 GCM 注销。

于 2013-01-09T16:12:07.967 回答