将通过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()函数:
pack('n', 32)
返回一个空格pack('H*', $device_token)
返回设备令牌的十六进制二进制表示pack('n', strlen($data))
返回一个不可见的字符,证明:
$data = array(
'message' => '12345678',
);
$data = json_encode($data);
echo '[' .pack('n', strlen($data)) . ']'; // which returns []
,最后一个是json编码的内容。
为什么Apple会设计这种结构?那些看不见的角色是什么?
答案 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的更多信息。