我需要用php服务器实现苹果推送通知。我认为连接正常工作但苹果服务器出于某种原因拒绝了该消息。
我收到了这个错误:
“error 0errorString
\ n 致命错误:调用未定义 函数socket_close() /home/www/76cdd1fbdfc5aca0c9f07f489ecd9188/web/mobileApp/handleRequest.php 的 在线 420
\ n“
这是我的简单代码(带有假邮件,仅供测试):
$payload['aps'] = array('alert' => 'This is the alert text', 'badge' => unread, 'sound' => 'default');
$payload['server'] = array('serverId' => $serverId, 'name' => $name);
$payload = json_encode($payload);
$apnsHost = 'gateway.sandbox.push.apple.com';
$apnsPort = 2195;
$apnsCert = 'ck.pem';
$streamContext = stream_context_create();
stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert);
$apns = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $error, $errorString, 2, STREAM_CLIENT_CONNECT, $streamContext);
echo "error " . $error;
echo "errorString" . $errorString;
$apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $deviceToken)) . chr(0) . chr(strlen($payload)) . $payload;
fwrite($apns, $apnsMessage);
socket_close($apns);
fclose($apns);
echo "Sent";
感谢
答案 0 :(得分:1)
我猜你的PHP版本可能没有安装或启用套接字功能,这就是你收到错误的原因。
取自PHP.net:
此处描述的套接字函数是PHP扩展的一部分,必须在编译时通过提供--enable-sockets选项来启用它。
但是对于您的代码,您不需要使用socket_close($apns)
函数。相反,你可以删除它并使用关闭(Quote from PHP.net):
成功时返回一个流资源,该资源可以与其他文件函数(例如fgets(),fgetss(),fwrite(),fclose()和feof())一起使用,失败时为FALSE。 / p>
因此,使用fclose($apns);
将关闭流
答案 1 :(得分:1)
没有关闭套接字的功能,你只能创建套接字并通过fwrite / fclose等管理它: http://php.net/manual/en/function.stream-socket-client.php
答案 2 :(得分:0)
替换:
socket_close($apns);
与
fclose($apns);
这应该可以解决您报告的错误:不确定这是否会真正解决您对APNS的问题。
答案 3 :(得分:0)
我实际上已经解决了。问题是消息的内容(空)。套接字功能完美无缺。
答案 4 :(得分:0)
$apnsHost = 'gateway.sandbox.push.apple.com';
删除" 沙箱"从这个网址开始,它就会运行。