通过php脚本发送iOS通知:“无法设置私钥文件”

我已经使用众所周知的Ray Wanderlich 教程中的php脚本在开发阶段发送推送通知。 在创buildpem文件(来自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文件configuration了一个密码),这是如何在php脚本中给出的。

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

这不是正确的p12文件。 我从Keychain中导出了正确的p12文件,并且运行良好。

得到教训 –

  1. 如果您使用的p12和cer文件彼此不对应,显然在连接的pem文件创build期间不会显示任何错误。 但是当你执行脚本时,会显示一个错误。

  2. 上述错误消息不一定意味着p12文件的密码不正确。 它们也可能意味着p12文件不对应于使用的cer文件。

设置$passphrase = '1234'$passphrase = "1234"为我解决了这个问题。

如果文件ck.pem在该位置存在,则可能是php脚本无法访问它。 我会将文件夹/文件的权限更改为更宽松,或尝试以超级用户身份运行脚本:

 sudo php simplepush.php 

编辑1:

经过一番研究,看起来pem文件可能是一个意想不到的格式。 您可以尝试更改文件中组合的证书的顺序。 您还可以尝试使用单独的文件并使用“stream_context_set_option”function指定每个文件。

编辑2:

如果可以的话,尝试按照教程的方法设置生产文件的密码。 它可能需要密码才能工作。 同样,pem文件听起来有些问题,不正确地生成,丢失或者格式错误。 检查文件。 如果不是安全风险的话,甚至可能会在你的问题中发布。 在弄清楚什么是错误之后,你可以重新生成一个新的密钥。

如果从命令行运行该文件,可以尝试给ck.pem文件的完整path

改变行: stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');

stream_context_set_option($ctx, 'ssl', 'local_cert', '/path/to/your/file/ck.pem');

为我工作

我得到了同样的错误。

我确定我的pem文件是正确的,我遵循这个指南: https : //developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ProvisioningDevelopment.html

debugging了很多,我发现我忘记了密码。

PS:我用这个PHP脚本: https : //github.com/duccio/ApnsPHP ,也许它可以帮助你。

我遇到了同样的问题,我使用1234作为密码。 而不是写$ passphrase ='1234'; 我写了$ passphrase = 1234; 它工作正常

一定要确保不要使用旧的APNS代码 (例如,您的开发和生产应用程序使用相同的数据库表)。 这会导致Apple APNS服务断开连接,因为它收到无效的APNS代码,因为不同的APNS代码用于开发和实际发布的应用程序。

另一种说法是:如果将应用发布到app store,请不要忘记重新生成密钥对。 开发证书不能在生产中使用!