В настоящее время популярность PHP и Apple / iOS Push Notifications с Command 2 становятся популярными. Однако не уверен, как подготовить формат для тех же, что и руководство Apple здесь , Как достичь формата пакета ниже:
Также хотел бы знать, как получить 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 используйте эту функцию: (по 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); } } }
Я считаю, что при построении $ msg вам нужно
. pack('N', strlen($msgInner))
поскольку в документации Apple говорится, что длина кадра должна быть 4 байта
«Длина кадра – 4 байта – Размер данных кадра»
и для pack()
'n' генерирует 16 бит, тогда как 'N' генерирует 32 бита
n – unsigned short (всегда 16 бит, большой байтовый порядок байтов)
N – беззнаковый длинный (всегда 32-разрядный, большой порядковый байтовый порядок)