从昨天开始,我一直遇到一些设备无法收到推送通知的问题。
证书/设备令牌似乎是正确的,
直到昨天,该设备才能成功接收推送通知。
在服务器端,没有错误或连接拒绝,
并且推送通知似乎每次都成功发送。
但仍然有很多情况下设备无法正确接收推送。
一些周边信息:
- 我正在生产环境中执行此操作。
- 服务器端没有错误/连接拒绝
- 我每次都发送完全相同的 JSON。
- 自昨天以来,我们的 2 台设备根本没有收到推送通知
- 我们的 1 台设备接收推送通知的成功率(约 70%)比昨天要低
- 即使现在,我们的 1~2 台设备仍然可以成功接收推送通知。
- 截至昨天,上述设备均能够在生产环境上正常接收推送通知。
当推送成功时和设备未收到推送时,服务器端结果没有区别......
因此,实际上不可能找出问题所在。
这是我正在使用的服务器端 PHP 代码:
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', $this->apnsData[$development]['certificate']);
$fp = stream_socket_client($this->apnsData[$development]['ssl'], $error, $errorString, 100, (STREAM_CLIENT_C ONNECT|STREAM_CLIENT_PERSISTENT), $ctx);
if(!$fp){
$this->_pushFailed($pid);
$this->_triggerError("Failed to connect to APNS: {$error} {$errorString}.");
}
else {
$msg = chr(0).pack("n",32).pack('H*',$token).pack("n",strlen($message)).$message;
$fwrite = fwrite($fp, $msg);
if(!$fwrite) {
error_log("[APNS] push failed...");
$this->_pushFailed($pid);
$this->_triggerError("Failed writing to stream.", E_USER_ERROR);
}
else {
error_log("[APNS] push successful! ::: $token -> $message ($fwrite bytes)");
}
}
fclose($fp);
日志告诉我推送成功(为了隐私而删除令牌):
[Wed Dec 12 11:42:00 2012] [error] [client 10.161.6.177] [APNS] push successful! ::: aa4f******44 -> {"aps":{"alert":{"body":"\\u300casdfasdf\\u300d","action-loc-key":"OK"},"badge":4,"sound":"chime"}} (134 bytes)
我该如何解决这个问题?