17

我在将 APNS 与 PHP 一起使用时遇到问题,并收到以下消息:

stream_socket_client(): Failed to enable crypto

这个问题有时会发生,有时它会实际发送推送。

由于我有 10 次迭代循环的测试脚本,我有时会得到这个:

stream_socket_client(): SSL: Connection reset by peer

我正在使用沙盒服务器进行测试tls://gateway.sandbox.push.apple.com:2195

这是我尝试过的:

  • 我试图重新颁发 PEM 和所有证书。
  • 我玩弄了请求协议sslv3://tls://.
  • 我玩弄了密码(顺便说一句,在没有密码的情况下推送)
  • 我尝试在 stackoverflow 中搜索解决方案,但没有任何效果。
  • 检查pem文件权限644
  • 检查 pem 父目录权限755

似乎我在 Google 和 SO 上找到的所有解决方案都是人们完全无法推动的。

我觉得服务费率可能有限?因为我们等待了一段时间(大约 15 分钟)然后再次尝试,并且能够成功推送大约 100 条消息,直到我再次开始收到该消息。

4

8 回答 8

14

沙盒推送服务有速率限制。我在测试时亲身经历过这种情况,但使用生产 API 时从未遇到过任何此类限制。

您可能还会遇到他们的其他保护措施。

您是在打开连接、发送消息、关闭连接然后循环并重新开始吗?

这将使您的通知被丢弃。Apple 希望您使用相同的连接发送多个推送通知,而不是每次都发送一个新的。

管理连接的最佳实践

您可以建立到同一个网关或多个网关实例的多个连接。如果您需要发送大量远程通知,请将它们分散到多个不同网关的连接上。与使用单个连接相比,这提高了性能:它可以让您更快地发送远程通知,并且可以让 APNs 更快地传递它们。

在多个通知中保持与 APN 的连接处于打开状态; 不要反复打开和关闭连接。APNs 将快速连接和断开连接视为拒绝服务攻击。您应该让连接保持打开状态,除非您知道它会长时间处于空闲状态——例如,如果您每天只向用户发送一次通知,则可以每天使用一个新连接。

来自 Apple Docs @ https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/CommunicatingWIthAPS.html

于 2015-03-23T21:52:25.600 回答
5

我的 PHP 代码正在生成以下错误:

PHP Warning:  stream_socket_client(): Failed to enable crypto in /private/tmp/t.php on line 12
PHP Warning:  stream_socket_client(): unable to connect to ssl://gateway.sandbox.push.apple.com:2195 (Unknown error) in /private/tmp/t.php on line 12
PHP Warning:  fclose() expects parameter 1 to be resource, boolean given in /private/tmp/t.php on line 24

问题是,该死的证书,前天过期了!:-) 你能相信吗?

所以,我需要重新创建我的 PEM 文件。

于 2015-10-30T02:57:35.673 回答
1

没有必要重新创建您的 pem 文件

当您使用不正确的密码短语时会发生该错误

问候埃米利亚诺

于 2015-11-16T19:57:26.013 回答
0

就我而言,问题出在我的 mac (OSX Sierra) 上。我将 php 和 cert 上传到我的服务器,运行它,并且通知已发送。

于 2016-12-17T18:11:44.710 回答
0

几项检查

  1. 设备令牌应该是 - with outspaces和 with out <or>
  2. 确保证书路径正确且过期日期。
  3. 确保您使用的密码是您用来制作证书的密码
于 2016-04-21T03:18:32.300 回答
0

我有这个问题。在为 .pem 文件的“所有人”授予写入权限后消失。

于 2015-11-26T06:49:29.193 回答
0

我尝试了教程中的 Marin Todorov iOs 6 书中的示例。在我可以发送自动更新的推送通知之前,我有很多令人头疼的握手错误原因 - stream_socket_client(): Failed to enable crypto.

我做了我在 Stackoverflow 中找到的所有内容 - 更改了证书和其他的权限。

我最终做了什么?

我创建了自签名 SSL 证书并设置 Apache 来提供 SSL。
此外,我在主机名中将 SSL 协议从 ssl 更改为 tls:

tls://gateway.push.apple.com:2195

之后服务工作。

于 2019-09-24T02:32:56.840 回答
0

我遇到了这个问题,因为在为 local_cert 提供文件路径时,我愚蠢地忘记了包含文件扩展名 (.pem)。

于 2016-02-29T23:06:11.530 回答