0

PHP で APNS の SSL チャネルを介して送信される APNS ペイロード構造は、次のように生成されます。

$payment = chr(0) . pack('n', 32) . pack('H*', $device_token) . pack('n', strlen($data)) . $data;

どこ:

  • $device_tokenAPNS によって生成および応答された 64 文字のデバイス トークンです。
  • $dataAPNS コンテンツ (メッセージなど) のパラメータを含む json エンコードされた配列です。

そのような構造設計の背後にある理由は何ですか?

関数chr()は、ascii で指定された文字を含む 1 文字の文字列を返します。しかしchr(0)、可視文字を返さないことは次のように証明されています:

echo '['.chr(0).']'; // which prints []

次に、連続する 3 つのpack()関数:

  1. 最初のものpack('n', 32)は空のスペースを返します
  2. 2 つ目pack('H*', $device_token)は、デバイス トークンの 16 進バイナリ表現を返します。
  3. 3 つ目は、次pack('n', strlen($data))のように証明された、目に見えない文字を返します。


$data = array(
  'message' => '12345678',
);
$data = json_encode($data);
echo '[' .pack('n', strlen($data)) . ']'; // which returns []

最後はjsonでエンコードされたコンテンツです。

Apple がこの構造を設計する理由は何ですか? それらの目に見えない文字は何ですか?

4

1 に答える 1

1

最初chr(0)は、0 を含むバイトを返します。これは、使用しているバイナリ形式を識別します。0は単純な形式に1使用され、拡張形式 (メッセージ識別子と有効期限を含む) に2使用され、iOS7 で導入された新しい形式に使用されます。

pack('n', 32)2 バイトでエンコードされた数値 32 を返します。これは、デバイス トークンのサイズをバイト単位で表します。32この場合、1 バイトで格納できるため、なぜ 2 バイトが必要なのかわかりません(また、デバイス トークンのサイズは常に 32 であるため、このフィールドは実際には必要ない可能性があります)。

pack('H*', $device_token)デバイス トークンの 16 進表現を 32 バイトのバイナリ表現にパックします。これは、64 バイトの 16 進表現を送信するよりも効率的です。

Third one pack('n', strlen($data))2 バイトでエンコードされたペイロードの長さを返します。ペイロードの長さは通常 < 256 (256 が限界) であるため、通常、これらの 2 バイトの最初のバイトには0.

それらinvisible charactersはまったくキャラクターではありません。通知を説明する番号です。

単純なバイナリ形式の詳細については、こちらを参照してください。

于 2013-10-11T14:29:09.213 に答える