APNS + PHP“stream_socket_client():未能启用encryption”

我在使用APNS和PHP时遇到了问题,并得到以下消息:

stream_socket_client(): Failed to enable crypto 

这个问题有时只会发生,而其他时候则会发生推动。

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

 stream_socket_client(): SSL: Connection reset by peer 

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

这是我试过的:

  • 我试图重新发布PEM和所有证书。
  • 我玩弄了请求协议sslv3://tls://
  • 我玩了密码(push没有密码btw)
  • 我试图寻找一个解决scheme的计算器,没有任何工作。
  • 检查pem文件的权限644
  • 检查pem父目录权限755

看来,我在Google和SO上find的所有解决scheme都是有问题的人。

我觉得这个服务可能是限速吗? 因为我们等了一会儿(大约15分钟),然后再试了一遍,并能够成功推送100条消息,直到我再次开始收到这条消息。

沙箱推送服务的速率是有限的。 我在testing时自己经历过这种情况,但从未遇到过使用生产API的任何限制。

你也可能会受到其他保护。

你是打开一个连接,发送一条消息,closures连接,然后循环再做一遍?

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

pipe理连接的最佳实践

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

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

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

我的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 

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

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

这是没有必要重新创build您的Pem文件

当您使用不正确的PassPhrase时,会发生该错误

关于埃米利亚诺

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

我有这个问题,因为我愚蠢地忘记包含文件扩展名(.pem)时提供local_cert的文件path。

几个检查

  1. 设备令牌应该是 – 没有spaces而且没有<>
  2. 确保证书的path正确并且过期。
  3. 确保您使用的密码是您用来制作证书的密码

在我的情况下,问题是我的Mac(OSX Sierra)。 我上传了PHP和证书给我的服务器,运行它,并通知交付。