推送通知:我几乎总是得到“连接失败”,但它工作了几次
Posted
技术标签:
【中文标题】推送通知:我几乎总是得到“连接失败”,但它工作了几次【英文标题】:Push Notifications: I almost always get "Connection failed" but it worked few times 【发布时间】:2011-09-19 07:57:57 【问题描述】:我正在测试一个带有推送通知的 iPhone 应用程序。
在过去的 5 天里,我让它工作了几次(它通常在几分钟的时间内连续通知工作)。
相反,我几乎总是收到错误消息:“连接失败”。
由于它工作了几次,我认为代码是正确的,并且证书也是有效的。所以我不知道如何解决这个问题。
我也尝试过多次连接,代码如下:
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');
$fp = stream_socket_client('ssl://gateway.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
for ( $tries = 5, $interval = 10, $fp = false; !$fp && $tries > 0; $tries-- )
if (!($fp))
print "Failed to connect $err $errstrn";
sleep ( $interval );
if ($fp)
...
输出:无法连接到 ssl://gateway.sandbox.push.apple.com:2195(连接被拒绝)
谢谢
【问题讨论】:
【参考方案1】:代码看起来基本正确。我建议你不需要循环(我从来没有);如果您过度发送相同的请求,甚至可能会给您带来麻烦。我不确定你为什么会有一些成功和一些失败,我发现 APN 服务器非常一致。
要检查的一个细节:您使用的 php 代码在 ssl 选项中不包含密码;如果您使用的 pem 文件受密码保护,则这是必需的。 (例如下面的代码)
我建议重新验证您进行身份验证的凭据。最好的方法是使用openssl
(来自终端),如 Apple 的故障排除技术说明 2265 中所述:http://developer.apple.com/library/ios/#technotes/tn2265/_index.html。我已经就以下 SO 问题写了一个很好的演练:Couldn't able to connect to APNS Sandbox server
验证 pem 文件后,您可以尝试使用以下 PHP 代码(从我的测试页面窃取):
// Put your private key's passphrase here:
$passphrase = 'p-a-s-s-p-h-r-a-s-e';
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'CertificateAndPrivateKey.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
// Open a connection to the APNS server
$fp = stream_socket_client('ssl://gateway.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;
希望对您有所帮助。
【讨论】:
以上是关于推送通知:我几乎总是得到“连接失败”,但它工作了几次的主要内容,如果未能解决你的问题,请参考以下文章