APNS有效负载结构设计

时间:2013-10-11 11:27:01

标签: php push-notification apple-push-notifications

将通过PHP中的APNS SSL通道发送的APNS有效负载结构如下所示:

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

其中:

  • $device_token生成64个字符的设备令牌&由APNS回复
  • $data是一个包含APNS内容参数的json编码数组(例如消息)

这种结构设计背后的原因是什么?

函数chr()返回一个包含ascii指定字符的单字符字符串。但是chr(0)没有返回可见字符,证明:

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

接下来,连续3个pack()函数:

  1. 第一个pack('n', 32)返回一个空格
  2. 第二个pack('H*', $device_token)返回设备令牌的十六进制二进制表示
  3. 第三个pack('n', strlen($data))返回一个不可见的字符,证明:

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

    ,最后一个是json编码的内容。

    为什么Apple会设计这种结构?那些看不见的角色是什么?

1 个答案:

答案 0 :(得分:1)

第一个chr(0)返回一个包含0的字节。它标识您正在使用的二进制格式。 0用于简单格式,1用于增强格式(包括消息标识符和到期时间),2用于它们在iOS7中引入的较新格式。< / p>

pack('n', 32)返回以两个字节编码的数字32。它表示设备令牌的大小(以字节为单位)。在这种情况下,我不确定为什么他们需要两个字节,因为32可以存储在一个字节中(并且设备令牌的大小总是32,所以这个字段可能不是真的必要)。 / p>

pack('H*', $device_token)将设备令牌的十六进制表示打包为32字节二进制表示。这比发送64字节十六进制表示更有效。

Third one pack('n', strlen($data))返回以两个字节编码的有效载荷的长度。由于有效载荷的长度通常小于1。 256(256是限制),这两个字节中的第一个通常包含0

那些invisible characters根本不是字符。它们是描述通知的数字。

您可以阅读有关简单二进制格式here的更多信息。