使用 PHP 从 Apple 增强推送通知中读取错误
Posted
技术标签:
【中文标题】使用 PHP 从 Apple 增强推送通知中读取错误【英文标题】:Reading error from Apple enhanced push notification with PHP 【发布时间】:2011-07-12 14:34:48 【问题描述】:我正在尝试触发错误,以便为 APNS 构建错误日志记录。因此我向服务器发送了一个太大的有效负载。但我没有错误。
代码:
连接:
$streamContext = stream_context_create();
stream_context_set_option($streamContext, 'ssl', 'local_cert', $this->_sslPem);
stream_context_set_option($streamContext, 'ssl', 'passphrase', "");
$this->_apnsConnection = stream_socket_client("ssl://" . Config::$apns['host'] . ":" . Config::$apns['port'], $error, $errorString, $timeout, STREAM_CLIENT_CONNECT, $streamContext);
if ($this->_apnsConnection)
stream_set_blocking($this->_apnsConnection, 0);
发送通知:
$this->_log("Sending notification to device token '$deviceToken'");
$identifiers = array();
for ($i = 0; $i < 4; $i++)
$identifiers[$i] = rand(1, 100);
$apnsMessage = chr(1) . chr($identifiers[0]) . chr($identifiers[1]) . chr($identifiers[2]) . chr($identifiers[3]) . pack('N', time() + 3600)
. chr(0) . chr(32) . pack('H*', str_replace(' ', '', $deviceToken)) . chr(0) . chr(strlen($message)) . $message;
$bytes = fwrite($this->_apnsConnection, $apnsMessage);
$this->_log("bytes written: $bytes");
$this->_log("Fetching response");
$response = fread($this->_apnsConnection, 6);
$this->_log("Strlen: " . strlen($response));
if ($response === false || strlen($response) != 6)
$this->_log("No response...");
else
$responseArray = unpack('Ccommand/CstatusCode/Nidentifier', $response);
$this->_log("Response!");
$this->_log($responseArray);
输出:
2011-07-12 16:25:55: Sending notification to device token 'XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX'
2011-07-12 16:25:55: bytes written: 438
2011-07-12 16:25:55: Fetching response
2011-07-12 16:25:55: Strlen: 0
2011-07-12 16:25:55: No response...
【问题讨论】:
【参考方案1】:我有办法解决这个问题。
解决方案:
$read = array($this->_apnsConnection);
$null = null;
$changedStreams = stream_select($read, $null, $null, 0, 1000000);
if ($changedStreams === false)
$this->_log("Error: Unabled to wait for a stream availability");
elseif ($changedStreams > 0)
$responseBinary = fread($this->_apnsConnection, 6);
if ($responseBinary !== false || strlen($responseBinary) == 6)
$response = unpack('Ccommand/Cstatus_code/Nidentifier', $responseBinary);
$this->_log($response);
【讨论】:
因为stream_set_blocking($this->_apnsConnection, 0); fread 将在错误有机会发送之前立即返回,请阅读***.com/questions/4034926/…以上是关于使用 PHP 从 Apple 增强推送通知中读取错误的主要内容,如果未能解决你的问题,请参考以下文章
Apple 推送通知服务 (APNS):反馈服务响应缺少字节?