我使用了众所周知的Ray Wanderlich tutorial的php脚本在开发阶段发送推送通知。在我创建pem文件(来自p12和aps_development.cer文件)并在php脚本中提到设备令牌后,它们被正确触发。
但是,当我使用具有生产p12和aps_production.cer文件的pem文件时,通知甚至没有到达APNS服务器。它在本地服务器端本身显示以下错误。
Unable to set private key file `/Users/administrator/Desktop/SimplePush/ck.pem' in /Users/administrator/Desktop/SimplePush/simplepush.php on line 22
Warning: stream_socket_client(): failed to create an SSL handle in /Users/administrator/Desktop/SimplePush/simplepush.php on line 22
Warning: stream_socket_client(): Failed to enable crypto in /Users/administrator/Desktop/SimplePush/simplepush.php on line 22
Warning: stream_socket_client(): unable to connect to ssl://gateway.push.apple.com:2195 (Unknown error) in /Users/administrator/Desktop/SimplePush/simplepush.php on line 22
可能是什么原因。 p12文件没有任何密码(虽然我已经为pem文件配置了密码),这就是它在php脚本中给出的方式。
// Put your private key's passphrase here:
$passphrase = '';
答案 0 :(得分:5)
这不是正确的p12文件。我从Keychain导出了正确的p12文件,并且进展顺利。
经验教训 -
如果您使用的p12和cer文件彼此不对应,显然在连接的pem文件创建过程中不会显示任何错误。但是当你执行脚本时,会显示一个错误。
上述错误消息并不一定意味着p12文件的密码错误。它们也可能意味着p12文件与使用的cer文件不对应。
答案 1 :(得分:3)
如果从命令行运行该文件,可能会尝试提供ck.pem文件的完整路径
更改行:
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');
到
stream_context_set_option($ctx, 'ssl', 'local_cert', '/path/to/your/file/ck.pem');
为我工作
答案 2 :(得分:3)
将$passphrase = '1234'
设置为$passphrase = "1234"
可以解决我的问题。
答案 3 :(得分:2)
如果文件ck.pem确实存在于该位置,则可能是php脚本无法访问它。我会将文件夹/文件的权限更改为更宽松的或尝试以超级用户身份运行脚本:
sudo php simplepush.php
修改1:
经过一些研究后,看起来pem文件可能处于意外格式。您可以尝试更改文件中组合的证书的顺序。您还可以尝试使用单独的文件并使用'stream_context_set_option'函数指定每个文件。
编辑2:
如果可以,请尝试以与教程相同的方式设置生产文件的密码。它可能需要使用密码才能工作。同样,pem文件听起来像是错误的,要么生成错误,要么丢失,要么格式错误。检查文件。如果不是安全风险,甚至可以在你的问题中发布它。你可以在搞清楚错误之后重新生成一把新钥匙。
答案 4 :(得分:1)
我得到了同样的错误。
我确定我的pem文件是正确的,我遵循本指南:https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ProvisioningDevelopment.html
调试了很多,我发现我忘记了密码。
PS:我使用了这个PHP脚本:https://github.com/duccio/ApnsPHP,也许它可以帮到你。
答案 5 :(得分:1)
我遇到了同样的问题,我使用1234作为密码。 而不是写$ passphrase ='1234'; 我写的是$ passphrase = 1234;它工作正常
答案 6 :(得分:0)
始终确保不使用旧的APNS代码(例如,您为开发和生产应用程序使用相同的数据库表)。这会导致Apple APNS服务断开连接,因为它收到了无效的APNS代码,因为不同的APNS代码用于开发和实际发布的应用程序。
另一句话:如果您将应用发布到appstore,请不要忘记重新生成密钥对。开发证书不能在生产中使用!