31

GCM: Getting Startedガイドの最後のセクションに続いて、結果を受け取った後にいくつかの簿記を行う必要があります。

ガイドからの引用:

結果を解析し、次の場合に適切なアクションを実行する必要があります。

  • メッセージが作成されたが、結果として正規の登録 ID が返された場合は、現在の登録
    ID を正規の登録 ID に置き換える必要があります。
  • 返されたエラーが NotRegistered の場合、アプリケーションがデバイスからアンインストールされているため、その登録 ID を削除する必要があります。

これら 2 つの条件を処理するコード スニペットを次に示します。

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

上記のガイドは、マルチキャストの場合ではなく、単一の結果を参照しています。マルチキャスト ケースの処理方法がわかりません。

    ArrayList<String> devices = new ArrayList<String>();

    for (String d : relevantDevices) {
        devices.add(d);
    }

    Sender sender = new Sender(myApiKey);
    Message message = new Message.Builder().addData("hello", "world").build();
    try {
        MulticastResult result = sender.send(message, devices, 5);

        for (Result r : result.getResults()) {
            if (r.getMessageId() != null) {
                String canonicalRegId = r.getCanonicalRegistrationId();
                if (canonicalRegId != null) {
                    // same device has more than on registration ID: update database
                    // BUT WHICH DEVICE IS IT?
                }
            } else {
                String error = r.getErrorCodeName();
                if (error.equals(Constants.ERROR_NOT_REGISTERED)) {
                    // application has been removed from device - unregister database
                    // BUT WHICH DEVICE IS IT?
                }
            }
        }
    } catch (IOException ex) {
        Log.err(TAG, "sending message failed", ex);
    }

デバイスのリストを送信すると、結果のリストが返されます。Result オブジェクトには登録 ID は含まれませんが、最初の ID が廃止された場合は正規 ID のみが含まれます。2 つのリストが相互に関連している場合 (つまり、順序とサイズが保持されている場合) は文書化されていません。

どの結果がどのデバイスを参照しているかを確認するにはどうすればよいですか?

- アップデート

以下の別の回答にソリューションのスニペットを貼り付けました

4

3 に答える 3

21

結果は、GCM サーバーに送信した registration_id 配列の順序になっています。たとえば、registration_ids が次の場合:

[id1, id4, id7, id8]

次に、取得した結果の配列は、id1、id4、id7、および id8 に対して同じ順序になります。

それに応じて各結果を解析する必要があります。たとえば、2 番目の結果に「id9」の「message_id」と「registration_id」がある場合、「id4」は現在廃止されており、id9 に置き換える必要があることがわかります。

于 2012-07-21T17:49:04.983 に答える
5

読者の便宜のために、複数のデバイスの応答を処理するスニペットを次に示します。

public void sendMessageToMultipleDevices(String key, String value, ArrayList<String> devices) {

        Sender sender = new Sender(myApiKey);
        Message message = new Message.Builder().addData(key, value).build();
        try {
            MulticastResult result = sender.send(message, devices, 5);
            MTLog.info(TAG, "result " + result.toString());


            for (int i = 0; i < result.getTotal(); i++) {
                Result r = result.getResults().get(i);

                if (r.getMessageId() != null) {
                    String canonicalRegId = r.getCanonicalRegistrationId();
                    if (canonicalRegId != null) {
                        // devices.get(i) has more than on registration ID: update database

                    }
                } else {
                    String error = r.getErrorCodeName();
                    if (error.equals(Constants.ERROR_NOT_REGISTERED)) {
                        // application has been removed from devices.get(i) - unregister database
                    }
                }
            }
        } catch (IOException ex) {
            MTLog.err(TAG, "sending message failed", ex);
        }
    }
于 2012-10-24T13:41:38.830 に答える