Я получаю эту ошибку после попытки выполнить мой php-скрипт для отправки push notifcation на мой iphone.
Я пробовал все, и ничего не работает. Я считаю, что это означает, что мой ck.pem
ошибочен, но я не уверен, что его key.pem или cert.pem ошибочны.
Пожалуйста помоги
скрипт
// This this a fake device id: $deviceToken = '9870h8v088bj29u080af894jj67klfgcv9mmm79k8e4l23456h908743n093e359'; // fake password: $passphrase = '123456'; // Put your alert message here: $message = 'New Message'; //////////////////////////////////////////////////////////////////////////////// $ctx = stream_context_create(); stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem'); stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); // Open a connection to the APNS server $fp = stream_socket_client( 'ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); if (!$fp) exit("Failed to connect: $err $errstr" . PHP_EOL); echo 'Connected to APNS' . PHP_EOL; // Create the payload body $body['aps'] = array( 'alert' => $message, 'sound' => 'default', 'badge' => '1' ); // Encode the payload as JSON $payload = json_encode($body); // Build the binary notification $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload; // Send it to the server $result = fwrite($fp, $msg, strlen($msg)); if (!$result) echo 'Message not delivered' . PHP_EOL; else echo 'Message successfully delivered' . PHP_EOL; // Close the connection to the server fclose($fp); ?>
ошибка
Warning: stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages: error:14094416:SSL routines:SSL3_READ_BYTES:sslv3 alert certificate unknown in /Users/daveking/Desktop/App Certificates/simplepush.php on line 21 Warning: stream_socket_client(): Failed to enable crypto in /Users/daveking/Desktop/App Certificates/simplepush.php on line 21 Warning: stream_socket_client(): unable to connect to ssl://gateway.sandbox.push.apple.com:2195 (Unknown error) in /Users/daveking/Desktop/App Certificates/simplepush.php on line 21 Failed to connect: 0
Что вы пробовали?
http://www.raywenderlich.com/3443/apple-push-notification-services-tutorial-part-12 http://www.raywenderlich.com/3525/apple-push-notification-services-tutorial-part-2
Это хороший учебник по созданию сертификата, создание php-скрипта и т. Д.
Хорошую ссылку, описывающую этапы, можно найти в http://blog.boxedice.com/2009/07/10/how-to-build-an-apple-push-notification-provider-server-tutorial/
Хорошая ссылка, чтобы получить голову вокруг проблем с сертификатами, проверить городской дирижабль:
http://urbanairship.com/docs/keys.html
И относительно одобрения, хорошо знать:
=>app signed with a dev cert = sandbox url & dev apns cert, app signed with =>appstore/adhoc cert = prod url & prod apns cert
также используя приложение adhoc / appstore на устройстве, которое ранее использовало приложение dev, приведет к сбою трамплина. (так что в основном нужны два устройства) (будет подтверждено).
Важно: вы ДОЛЖНЫ сохранить соединение с песочницей, то есть НЕ должны подключаться, отправлять push, отключать. Если вы это сделаете, Apple может подавить вас как возможный ddos
Пример сценария PHP для запуска push-уведомления с сервера может выглядеть примерно так:
<?php // from http://www.macoscoders.com/2009/05/17/iphone-apple-push-notification-service-apns/ // call: /apns/apns.php?message=Hello%20from%20macoscoders&badge=2&sound=received5.caf $deviceToken = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; // Passphrase for the private key (ck.pem file) // $pass = ; // Get the parameters from http get or from command line $message = $_GET['message'] or $message = $argv[1] or $message = 'Message sent ' . @date("H:i:sd/M/Y", mktime()); $badge = (int)$_GET['badge'] or $badge = (int)$argv[2] or $badge = 111; $sound = $_GET['sound'] or $sound = $argv[3] or $sound = 'chime'; // Construct the notification payload $body = array(); $body['aps'] = array('alert' => $message); if ($badge) $body['aps']['badge'] = $badge; if ($sound) $body['aps']['sound'] = $sound; /* End of Configurable Items */ $ctx = stream_context_create(); stream_context_set_option($ctx, 'ssl', 'local_cert', 'push/apns-dev.pem'); // assume the private key passphase was removed. // stream_context_set_option($ctx, 'ssl', 'passphrase', $pass); $fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx); if (!$fp) { print "Failed to connect $err $errstr\n"; return; } else { print "Connection OK "; } $payload = json_encode($body); // request one $msg = chr(0) . pack("n",32) . pack('H*', str_replace(' ', , $deviceToken)) . pack("n",strlen($payload)) . $payload; print "sending message :" . $payload . "\n"; fwrite($fp, $msg); fclose($fp); ?>
Вы также можете посмотреть код EasyAPNS .
Рабочий код здесь:
<?php $deviceToken = '8845ba7c41e95e12caea6381ea6f01b5cd7b59a52feb9005e0727a65a4105dc2a0'; $passphrase = ''; $message = 'Your message'; $ctx = stream_context_create(); stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem'); stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); // Open a connection to the APNS server $fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); if (!$fp) exit("Failed to connect: $err $errstr" . PHP_EOL); echo 'Connected to APNS' . PHP_EOL; $body['aps'] = array( 'alert' => array( 'body' => $message, 'action-loc-key' => 'Bango App', ), 'badge' => 2, 'sound' => 'oven.caf', ); $payload = json_encode($body); // Build the binary notification $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);