2

Facebook と GCM を使用するアプリを作成しています。ユーザーは複数のデバイスでアプリを使用でき、友人は Facebook ID を使用して GCM メッセージを送信できます。

私のサーバーには、facebook id を gcm id にマップするテーブルがあります。このテーブルでは facebook ID が一意である必要がないため、メッセージを複数のデバイスに送信できます。

ドキュメントでは、メッセージを送信するときにエラーを処理する次の方法を示しています。

if (result.getMessageId() != null) {
 String canonicalRegId = result.getCanonicalRegistrationId();
 if (canonicalRegId != null) {
   //CASE 1
   // same device has more than on registration ID: update database
 }
} else {
 String error = result.getErrorCodeName();
 if (error.equals(Constants.ERROR_NOT_REGISTERED)) {
   // CASE 2
   // application has been removed from device - unregister database
 }
}

ではCASE 1、登録 ID を正規の登録 ID に置き換えるように指示されています。しかし、どの登録 ID を置き換えるかをどのように知ることができますか? 受信機に 2 つのデバイスがあり、選択できる登録 ID が 2 つありますが、どちらを選択すればよいかわかりません。

ではCASE 2、同じ問題が発生します。データベースから削除する登録 ID を知るにはどうすればよいですか?

EDIT
明確にするために、これは私が現在使用しているコードです:

List<String> gcmIds = getGCMIds(c, fbId);
if (gcmIds != null && !gcmIds.isEmpty()) {
    Sender sender = new Sender(Params.GOOGLE_API_KEY);
    Message message = new Message.Builder().addData("message", apiMessage.buildJSONString()).build();
    MulticastResult result = sender.send(message, gcmIds, 5);

    List<Result> results = result.getResults();
        /* Do something with the results */

    success = result.getFailure() == 0;
} else {
    success = false;
}
4

2 に答える 2

3

ケース 1 の場合:ドキュメントから:

GCM は、このような状況から簡単に回復できるように、「正規登録 ID」と呼ばれる機能を提供します。正規登録 ID は、アプリケーションによって要求された最後の登録の ID として定義されます。これは、サーバーがデバイスにメッセージを送信するときに使用する ID です。

デバイスのリストにメッセージを送信すると、結果のリストは同じ順序になります。したがって、実際には、結果と同じインデックスで使用されている regID を検索し、dataStore でその登録 ID を置き換えることができます。canonical IDを忘れずに保管してください。これは最近登録されたものです。

ケース 2 の場合: 同様に、同じインデックスにあった regID を削除します。

完全なサンプル実装については、実装しているものと同様の send 呼び出しの公式デモ コードをご覧ください。

于 2012-12-06T21:48:21.703 に答える
2

GCM応答形式のドキュメントを確認することをお勧めします:https ://developer.android.com/google/gcm/gcm.html#response

具体的にはこの部分:

結果

処理されたメッセージのステータスを表すオブジェクトの配列。オブジェクトはリクエストと同じ順序で一覧表示され(つまり、リクエスト内の登録IDごとに、その結​​果はレスポンス内の同じインデックスに一覧表示されます)、次のフィールドを持つことができます。

message_id:メッセージが正常に処理されたときのメッセージを表す文字列。

register_id:設定されている場合、GCMはメッセージを処理しましたが、そのデバイスの別の正規登録IDを持っているため、送信者は今後のリクエストでIDを置き換える必要があります(そうしないと、拒否される可能性があります)。リクエストにエラーがある場合、このフィールドは設定されません。

error:その受信者のメッセージの処理中に発生したエラーを説明する文字列。可能な値は、上記の表に記載されている値に「使用不可」を加えたものと同じです(GCMサーバーがビジーで、その特定の受信者のメッセージを処理できなかったため、再試行できた可能性があります)。

そしてこの部分:

register_idが設定されている場合は、サーバーデータベースで元のIDを新しい値(正規ID)に置き換えます。元のIDは結果の一部ではないため、リクエストで渡されたregistration_idsのリストから(同じインデックスを使用して)取得する必要があることに注意してください。

したがって、更新する必要のある登録IDは、(メッセージ用に作成した登録ID配列内の)正規IDと同じインデックスにあります。

于 2012-12-06T22:32:55.543 に答える