11

つまり、送信できますか

{
  "registration_ids": ["whatever", ...],
  "data": {
    "foo": {
      "bar": {
        "baz": [42]
      }
    }
  }
}

または、GCM リクエストの「データ」メンバーは、キーと値のペアの 1 つのレベルに制限されていますか? 私は b/c に、Google のドキュメント [1] の文言によって制限が示唆されていることを尋ねます。「データ」は次のとおりです。

メッセージのペイロード データのキーと値のペアを表すフィールドを持つ JSON オブジェクト。存在する場合、ペイロード データはアプリケーション データとしてインテントに含まれ、キーはエクストラの名前になります。たとえば、"data":{"score":"3x1"} は、値が文字列 3x1 であるスコアという名前のインテント エクストラになります。キーと値のペアの数に制限はありませんが、メッセージの合計サイズ。オプション。

[1] http://developer.android.com/guide/google/gcm/gcm.html#request

4

3 に答える 3

7

自分でテストを行い、私の推測を確認しました。

このペイロードで GCM を自分に送信します。

{
  "registration_ids": ["whatever", ...],
  "data": {
     "message": {
        "bar": {
           "baz": [42]
        }
     }
  }
}

そして、私のクライアントはそれを受け取り、「メッセージ」インテント エクストラを次のように解析します。

handleMessage - message={        "bar": {          "baz": [42]        }      }  

したがって、データキーの値に対してさらに JSON 解析を行うことができます。

于 2012-07-11T03:49:37.447 に答える
2

動作しているように見えますが (他の回答とコメントを参照)、Google からの明確な声明がなければ、ドキュメントでは常に json のトップレベルのメンバーを「キーと値のペア」として参照しているため、それに依存することはお勧めしません。彼らが提供するサーバー側のヘルパー jar [1] も、ユーザー データを としてモデル化するため、この考えを強化しますMap<String, String>。彼らのMessage.Builder.addDataメソッドは文字列以外の値さえサポートしていないため、ブール値、数値、および null は json で表現できますが、それらの使用にも注意が必要です。

Google がバックエンド コードを更新して、この (ほぼ間違いなくサポートされていない) 使用法を壊した場合、それに依存するアプリは引き続き機能するために更新が必要になります。安全のために、値が json 文字列化されたディープ オブジェクトである単一のキーと値のペアを使用します [2]。私のデータはそれほど大きくなく、json-inside-json のオーバーヘッドを許容できますが、ymmv. また、私のメンバーの1つは可変長リストであり、それらをキーと値のペアにフラット化することは常に醜いです:)

[1] http://developer.android.com/guide/google/gcm/server-javadoc/index.html (jar 自体は、http: //developer.android.com/guide/google/gcm/gs.html#server-app )

[2] たとえば、ペイロード全体は次のようになります。

{
  "registration_ids": ["whatever", ...],
  "data": {
    "player": "{\"score\": 1234, \"new_achievements\": [\"hot foot\", \"nimble\"]}"
  }
}
于 2012-07-28T22:28:37.227 に答える