自从昨天以来,我遇到了一些设备无法接收推送通知的问题。 证书/设备令牌似乎是正确的, 因为该设备用于成功接收推送通知直到昨天。
在服务器端,没有错误或连接拒绝, 并且推送通知似乎每次都成功发送。
但是,在很多情况下,设备无法正确接收推送。
一些周边信息:
推送成功时,以及设备未收到时,服务器端结果没有区别...... 因此,几乎不可能确定问题。
这是我正在使用的服务器端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)
我该如何解决这个问题?
答案 0 :(得分:4)
我自己解决了这个问题,所以我会发布一个答案。
我已收到建议,建议不要为每条消息打开和关闭套接字,如Apple官方文档中所述:
“您还应该在多个通知中保留与APN的连接.APN可以考虑快速重复建立的连接,并将其拆除为拒绝服务攻击。一旦出错,APN将关闭发生错误的连接。 “
我修复了我的架构,以便在多个APNS调用中保留连接,现在它正在运行而没有任何问题。 我创建了一个基于apns-php(https://code.google.com/p/apns-php/)的排队系统。
这是我的代码,适合任何需要它的人:
答案 1 :(得分:1)
首先检查您的设备是否越狱,然后它将不支持PushNotification。为此,您必须从Cydia下载SAMPref应用程序并打开该应用程序,然后您的设备支持推送通知。您可以使用应用程序商店中的iPusher应用程序测试设备的推送通知。如果您收到推送通知,则表示您的设备受支持。
首先检查您的应用是否已使用正确的推送通知启用证书进行签名?
感谢