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 に答える