クライアント/サーバー Android GCM アプリケーションの実装に成功しました。私のアプリ サーバーは、device/registration_id ペアのデータベースを保持しています。メッセージは、Web アクセス可能な PHP ページを介してデバイスに送信されます。サーバー側でエラー処理を記述しようとしています。特に、応答に canonical_id が含まれている場合です。開発者向けドキュメントには、何を行う必要があるか、およびそのような応答が生成される理由が明確に記載されています。
正規 ID
サーバー側では、アプリケーションが正常に動作している限り、すべて正常に動作するはずです。ただし、アプリケーションのバグによって同じデバイスに対して複数の登録がトリガーされると、状態を調整するのが難しくなり、メッセージが重複してしまう可能性があります。
GCM は、このような状況から簡単に回復できるように、「正規登録 ID」と呼ばれる機能を提供します。正規登録 ID は、アプリケーションによって要求された最後の登録の ID として定義されます。これは、サーバーがデバイスにメッセージを送信するときに使用する ID です。
後で別の登録 ID を使用してメッセージを送信しようとすると、GCM は通常どおりリクエストを処理しますが、レスポンスの registration_id フィールドに正規の登録 ID が含まれます。最終的に使用している ID が機能しなくなるため、サーバーに保存されている登録 ID をこの正規 ID に置き換えてください。
そのため、私の Android クライアント アプリ内には、最初に登録解除する手間をかけずに、デバイスを GCMRegistrar.register() にもう一度登録する開発専用ボタンがあります。これにより、最初に登録したときとは異なる registration_id が取得され、Web からデバイスにメッセージを送信すると (おそらく古い ID を使用して)、canonical_id で応答が返されると想定していました。
ただし、2 回目の登録では、1 回目とまったく同じ reg_id が返されます。
したがって、サーバー上の PHP 経由でメッセージを送信しても、応答に canonical_id が表示されません。PHP のスキルがあまり高くないため、データベースを更新する必要があることを示す canonical_id が返される状況を実際にテストする必要があります。
どうすればそのような反応を引き起こすことができるかについてのアイデアは、ありがたく受け取られます。
更新: 電話からアプリをアンインストールしてから再インストールしようとしました。私はまだ同じreg_idを取得しています。