0

在 PHP 中将通过 APNS 的 SSL 通道发送的 APNS 有效负载结构是这样生成的:

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

在哪里:

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

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

函数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))返回一个不可见的字符,证明如下:


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

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

苹果为什么要设计这种结构?那些看不见的角色是干什么用的?

4

1 回答 1

1

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

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

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

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

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

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

于 2013-10-11T14:29:09.213 回答