【问题标题】:APNS Payload Structure DesignAPNS 有效负载结构设计
【发布时间】:2013-10-19 11:11:53
【问题描述】:

在 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编码的内容。

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

【问题讨论】:

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


    【解决方案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 根本不是字符。它们是描述通知的数字。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-23
      • 1970-01-01
      • 2016-01-04
      • 1970-01-01
      • 2020-06-30
      • 2019-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多