无法连接到ssl://gateway.sandbox.push.apple.com:2195(连接被拒绝)

12

我有一个问题,我想使用PHP发送推送通知,但是我一直收到这个错误:

Warning: stream_socket_client() [function.stream-socket-client]: unable to connect to ssl://gateway.sandbox.push.apple.com:2195 (Connection refused) in /home/colupon/public_html/iPhone/push/index.php on line 21
Failed to connect: 111 Connection refused

我的代码如下:

$deviceToken = '0f************************************************************78';

$passphrase = '************';

$message = 'My first push notification!';

////////////////////////////////////////////////////////////////////////////////

$ctx = stream_context_create();
$filename = 'ckdev.pem';
stream_context_set_option($ctx, 'ssl', 'local_cert', $filename);
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);

// Open a connection to the APNS server
$fp = stream_socket_client(
'ssl://gateway.sandbox.push.apple.com:2195', $err,
$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);

if (!$fp)
exit("Failed to connect: $err $errstr" . PHP_EOL);

echo 'Connected to APNS' . PHP_EOL;

// Create the payload body
$body['aps'] = array(
'alert' => $message,
'sound' => 'default'
);

// Encode the payload as JSON
$payload = json_encode($body);

// Build the binary notification
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . 

$payload;

// Send it to the server
$result = fwrite($fp, $msg, strlen($msg));

if (!$result)
    echo 'Message not delivered' . PHP_EOL;
else
    echo 'Message successfully delivered'.PHP_EOL;

// Close the connection to the server
fclose($fp);

?>

我认为问题出在我使用的服务器上,因为我在另一台不同的服务器上发布了相同的代码和.pem文件,并且成功发送了通知。我尝试在我的服务器上打开防火墙端口,因为我读到可能会导致此问题,但是仍然显示相同的错误消息。还有其他什么办法吗?非常感谢您的任何帮助!

5个回答

15

这个问题是苹果推送通知中的常见问题,要解决此错误,您需要按照以下步骤进行:

  1. 在本地和远程服务器上测试您的pem文件,如果问题是服务器问题,则转到步骤2,否则构建正确的pem文件。

  2. 设置证书文件所在文件夹的权限错误。这对我起作用:

chmod 755 your_folder_that_has_certificate_files

3.检查从您的托管服务器到apns端口2195的连接性,如下所示:

运行

 telnet gateway.push.apple.com 2195

如果这是问题

Trying 17.172.233.36...
telnet: connect to address 17.172.233.36: Connection refused

您可以通过在生产服务器上打开端口2195来解决此问题。 您可以通过以下命令进行验证 $telnet gateway.push.apple.com 2195

-bash-3.2# telnet gateway.push.apple.com 2195

Trying 17.149.38.141...
Connected to gateway.push.apple.com (17.149.38.141).
Escape character is '^]'.
Connection closed by foreign host. 

2
我该如何从我的托管服务器上使用telnet?我正在使用godaddy。这些服务器通常允许telnet到它们的服务器,但不允许从它们的服务器到另一个服务器。如果您能为此提供一些帮助,那将非常好。目前,如果我在本地运行APN,则可以正常工作,但是当我将文件上传到godaddy托管时,我会收到连接被拒绝的错误。 - Saad Bashir
你解决了这个问题吗,Saad?我也处于完全相同的情况。谢谢。 - Ryan
另一种方法是这样的,创建一个临时链接到您的服务器,例如192.4.3.xx /〜username / foldername / filename,然后访问即可。 - MQ.
嗨@SaadBashir,我在Godaddy上遇到了同样的问题。你解决了吗? - johnny
@SaadBashir 面临相同的问题。你找到任何解决方案了吗? - Hitesh Surani
在我的情况下,服务器上的端口被禁用了。 - oparam

2

对于MAC,(我使用终端内置服务器正常工作,但无法通过浏览器进行访问,所以我安装了MAMP。)

1.进入-->/Library/WebServer/Documents/----将phpckdev.pem文件都复制到此处。

2.打开终端-->$open /private/etc-->进入--->apache2>originals>httpd.config文件--> **“#LoadModule php5_module libexec/apache2/libphp5.so”,删除“#”..(也许你还需要更改权限..!)

然后在浏览器中检查--> localhost/yourPhpFile.php

对于Windows系统

1.安装WAMP,

2.进入php.ini文件-->搜索这一行“;extension=php_openssl.dll”,并删除分号“;”。

3.点击右下角的WAMP图标,进入PHP>PHP Extensions>选择php_openssl..

就是这样..希望这可以帮助进一步寻求帮助的人。


1
在我的情况下,问题是我忘记正确设置php脚本中的密码短语。
<?php

// Put your device token here (without spaces):
$deviceToken = 'xxx';

// Put your private key's passphrase here:
$passphrase = 'xxx';

0

我刚刚遇到了同样的错误,但我找到了解决方法。

'mypassword' 而不是 ‚mypassword‘

看起来记事本改变了引号。这让我浪费了整整4个小时... 希望有人能看到这篇文章并节省时间...


0

对我来说,这是一个SELinux问题。

所以在你的/etc/selinux/config文件中,将SELINUX=enforcing设置为SELINUX=disabled。然后重新启动。就这样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接