PHP Apple iOS推送通知:Command2:二进制接口和通知格式

如今,使用Command 2的PHP和Apple / iOS推送通知已经越来越stream行。 不过不知道,如何根据苹果指南在这里准备相同的格式,如何实现下面的包格式:

PHP iOS推送通知:Command2:二进制接口和通知格式

还想知道,如何接收Format of error-response packet如下所述:

错误响应数据包的格式

目前我使用的格式如下:

 $msg = // new: Command "1" chr(1) // new: Identifier "1111" . chr(1) . chr(1) . chr(1) . chr(1) // new: Expiry "tomorrow" . pack('N', time() + 86400) // old . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $deviceToken)) . chr(0) . chr(strlen($payload)) . $payload; 

 fwrite($fp, $msg, strlen($msg)); 

 //command 2 $msgInner = chr(1) . pack('n', 32) . pack('H*', $deviceToken) . chr(2) . pack('n', strlen($payload)) . $payload . chr(3) . pack('n', 4) . chr(1).chr(1).chr(1).chr(1) . chr(4) . pack('n', 4) . pack('N', time() + 86400) . chr(5) . pack('n', 1) . chr(10); $msg= chr(2) . pack('N', strlen($msgInner)) . $msgInner; 

并为命令8使用此function:(由Yudmt)在关于苹果增强通知格式

 function error_response($fp) { $read = array($fp); $null = null; $changedStreams = stream_select($read, $null, $null, 0, 1000000); if ($changedStreams === false) { echo ("Error: Unabled to wait for a stream availability"); } elseif ($changedStreams > 0) { $responseBinary = fread($fp, 6); if ($responseBinary !== false || strlen($responseBinary) == 6) { $response = unpack('Ccommand/Cstatus_code/Nidentifier', $responseBinary); var_dump($response); } } } 

我相信在build立$味精你需要

 . pack('N', strlen($msgInner)) 

因为苹果的文档说帧长度应该是4个字节

“帧长度 – 4个字节 – 帧数据的大小”

pack() 'n'产生16位,而'N'产生32位

n – 无符号短(总是16位,大端字节顺序)

N – 无符号长(总是32位,大端字节顺序)