在ios中推送通知

我是一个新的PHP和编写代码推送通知CodeGo.net,但我得到了这些erros。

这是我的模特

function sendmessage($appid, $deviceid, $status, $message) { $deviceToken = '0f744707bebcf74f9b7c25d48e3358945f6aa01da5ddb387462c7eaf61bbad78'; $message = 'My first push notification!'; $ctx = stream_context_create(); stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem'); //stream_context_set_option($ctx, 'ssl', 'passphrase', 'essar@123'); $fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx); if (!$fp){ exit("Failed to connect: $err $errstr" . PHP_EOL); } else { print "Connection OK/n"; } echo 'Connected to APNS' . PHP_EOL; $body['aps'] = array( 'alert' => $message, 'sound' => 'default' ); $payload = json_encode($body); $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload; $result = fwrite($fp, $msg, strlen($msg)); if (!$result) echo 'Message not delivered' . PHP_EOL; else echo 'Message successfully delivered' . PHP_EOL; fclose($fp); $data = array( 'message' => $this->message . 'add', 'appid' => $this->appid, 'deviceid' => $this->deviceid, 'status' => $status ); $this->sendmessage($data); 

错误信息:

消息:stream_socket_client():SSL操作失败,代码为1. OpenSSL错误消息:错误:14094410:SSL例程:SSL3_READ_BYTES:sslv3警报握手失败消息:stream_socket_client():无法启用encryption消息:stream_socket_client():无法连接ssl://gateway.sandbox.push.apple.com:2195(未知错误)

一旦你创build了临时证书,并推送通知发展和分配。 按照“生成推送通知”的步骤进行操作

为了使用您生成的证书,您需要创build一个PEM文件 ,同时存储您的Apple推送通知服务SSL证书和您的私钥。 您可以从terminal创buildPEM文件。

导航到包含之前生成的证书和密钥的目录,然后执行以下步骤。 这里的文件名称反映了作为本课程一部分生成的证书的名称。 你必须根据你给你的证书的名字更新语法。

首先创build应用程序证书PEM文件。 您可以通过双击aps_developer_identity.cer证书文件,然后打开Keychain Assistant并将证书导出为ap12文件,然后将其转换为PEM文件,方式与PushNotificationApp.p12转换为PEM相同文件。 或者,您可以使用单个命令行将aps_developer_identity.cer证书文件直接转换为PEM文件。 这里我们select单个命令行选项,如下所示:

 openssl x509 -inform der -outform pem -in aps_developer_identity.cer -out PushNotificationAppCertificate.pem 

现在按如下方式创build应用程序密钥PEM文件。 您需要input导入密码和PEM密码短语:

 openssl pkcs12 -in PushNotificationApp.p12 -out PushNotificationAppKey.pem -nocerts 

input导入密码:MACvalidationOKinputPEM密码短语:validation – inputPEM密码短语:

现在连接两个文件:

 cat PushNotificationAppCertificate.pem PushNotificationAppKey.pem > PushNotificationAppCertificateKey.pem 

打开Macterminal并从包含您生成的证书的目录执行以下行:

 openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert PushNotificationAppCertificate.pem -key PushNotificationAppKey.pem 

然后要求您input您提交的密钥的密码短语:

 Enter pass phrase for PushNotificationAppKey.pem: 

如果一切正常,那么服务器应该向你发送很多类似下面的信息:

 CONNECTED(00000003) depth=1 /C=US/O=Entrust, Inc./OU=www.entrust.net/rpa is incorporated by reference/OU=(c) 2009 Entrust, Inc./CN=Entrust Certification Authority - L1C verify error:num=20:unable to get local issuer certificate verify return:0 ... Key-Arg : None Start Time: 1326899631 Timeout : 300 (sec) Verify return code: 0 (ok) At the end of this, you can enter some text and then select the return key. We entered the text "**Hello World**". **Hello World closed** 

这完成了与服务器的通信,并validation我们的证书是否正常工作。

在这里输入图像说明

我在这里遇到了同样的问题。 这花了一些时间,头挠划find…

我发现纠正握手错误的解决scheme是下载委托证书,并使用以下代码将其包含在stream上下文中:

 $entrustCert = '<full path to cert>/entrust_2048_ca.cer'; stream_context_set_option($ctx, 'ssl', 'cafile', entrustCert); 

有似乎与沙箱APN服务的间歇性连接问题。 我偶尔会得到如下错误:

 Warning: stream_socket_client(): SSL: Connection reset by peer Warning: stream_socket_client(): Failed to enable crypto 

我希望这是一个节省时间的人!