Мое приложение все еще находится в разработке, и я использовал этот учебник для отправки уведомлений iOS Push с помощью PHP и SSL.
http://www.raywenderlich.com/32960/apple-push-notification-services-in-ios-6-tutorial-part-1
Он работал, но недавно он обесценился, потому что Apple недавно решила отказаться от SSL, немедленно затрагивая все приложения в разработке, а приложения в производстве – до 29 октября, чтобы изменить свой код.
Я хотел бы знать, как сделать то же самое, используя TLS вместо SSL.
Вот что мой PHP, который работал, выглядит так:
$ctx = stream_context_create(); stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem'); stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); $fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
Я попытался добавить сертификат Entrust, поскольку Apple предлагает:
$ctx = stream_context_create(); stream_context_set_option($ctx, 'tls', 'local_cert', 'ck.pem'); stream_context_set_option($ctx, 'tls', 'passphrase', $passphrase); stream_context_set_option($ctx, 'tls', 'cafile', 'entrust_2048_ca.cer'); $fp = stream_socket_client('tls://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
Но это все еще не работает. Есть ли у вас предложение исправить это?
$ctx = stream_context_create(); stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem'); stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); stream_context_set_option($ctx, 'ssl', 'cafile', 'entrust_2048_ca.cer'); $fp = stream_socket_client('tls://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
если вы работаете в локальной среде, не забудьте загрузить файл сертификации entrust_2048_ca.cer
<?php $message = 'aa_' . rand(10000,99999); $deviceToken = array( 'xxxxxx' ); $ctx = stream_context_create(); stream_context_set_option($ctx, 'ssl', 'passphrase', '111111'); stream_context_set_option($ctx, "ssl", "local_cert", './apns.pem'); $fp = NULL; $errno = NULL; $errstr = NULL; $fp = stream_socket_client("tls://gateway.sandbox.push.apple.com:2195", $errno, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); if($fp === FALSE){ exit('error message'); } $content = array("aps" => array("alert" => $message, "badge" => 4, "sound" => 'default', "code" => 200)); $data = json_encode($content); foreach ($deviceToken as $token) { $msg = chr(0) . pack("n", 32) . pack("H*", $token) . pack("n", strlen($data)) . $data; fwrite($fp, $msg); fflush($fp); } fclose($fp);
Вот несколько советов, которые должны помочь вам разобраться:
Перейдите по адресу entrust.net/downloads/root_request.cfm и загрузите файл entrust_2048_ca.cer
Добавьте следующий код: stream_context_set_option ($ ctx, 'ssl', 'cafile', 'entrust_2048_ca.cer');
Убедитесь, что правильный путь: '../folder/file/ck.pem'?
Переключитесь и попробуйте как песочницу, так и живые ссылки ssl.
Переключатель dev и производственный пем и попробуйте оба.