我在谷歌云上托管了我的PHP代码。
我想向ios应用发送推送通知。我启用了端口2195和2196。
发送推送通知时出现以下错误:
警告:stream_socket_client():SSL:由对等方重置连接
警告:stream_socket_client():无法启用加密
警告:stream_socket_client():无法连接 ssl://gateway.push.apple.com:2195(未知错误)
我对谷歌云并不熟悉。我该怎么做才能让它发挥作用?
这是代码:
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', PEM_FILE_PATH . 'apns-dev.pem');
$fp = stream_socket_client("ssl://gateway.push.apple.com:2195", $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
if (!$fp) {
$data['msgs'] = "Failed to connect $err $errstr \n";
} else {
$payload = json_encode($body);
$msg = chr(0) . pack("n", 32) . pack("H*", str_replace(" ", "", $deviceToken)) . pack("n", strlen($payload)) . $payload;
$result = fwrite($fp, $msg);
if (!$result) {
$data['msgs'] = 'Message not delivered'; //. PHP_EOL;
} else {
$data['msgs'] = 'Success'; //. PHP_EOL;
}
fclose($fp);
}
return $data;
答案 0 :(得分:1)
我们尝试向APNS(Apple推送通知服务)服务器发送数据时的主要问题是 SSL证书。
APNS使用此技术以便为其用户提供更安全的连接。
正如APNS documentation所述:“每个证书仅限于一个应用程序,并且仅限于两个开发环境中的一个,每个开发环境都有自己分配的主机名”。所以你可以使用两种环境
开发(测试环境):ssl://gateway.sandbox.push.apple.com:2195
制作(启动应用后):ssl://gateway.push.apple.com:2195
如果您想测试是否可以连接到APNS服务器,请尝试以下命令:
$ telnet gateway.sandbox.push.apple.com 2195
Trying 17.172.232.226...
Connected to gateway.sandbox.push-apple.com.akadns.net.
Escape character is '^]'.
如果收到错误,请确保防火墙允许端口2195上的传出连接。
然后,您可以测试您的SSL证书和私钥是否正常工作,并且可以设置安全连接:
$ openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert YourDevCert.pem -key YourPrivateKey.pem
Enter pass phrase for YourPrivateKey.pem: ******
如果这有效,则意味着您的证书已正确设置(您应该看到一大堆输出,这是openssl让您知道幕后发生了什么)。
一旦了解了所有这些信息,我发现您的代码中有一个错误,您还应该检查其他内容:
$payload
变量是否为json字符串。$deviceToken
。apns-dev.pem
证书并将其发送到生产环境(我认为您的生产证书是apns-prod.pem
,请检查它。) stream_context_set_option($ctx, "ssl", "passphrase", "your_private_key");
如果您遇到麻烦或疑虑,我会按this tutorial发送我的第一个APNS推送通知。