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");
}
}
その後、アプリが追加のインテントを受け取るたびに、登録 ID をアプリ サーバーに送信する必要があります。これは、Google がアプリの ID を定期的に更新するときに発生する可能性があります。com.google.android.c2dm.intent.REGISTRATION
registration_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 をアップロードできます。これは、サーバー側でのアップグレードと登録の変更の追跡とデバッグにも役立つ場合があります。