Как отправить iOS Push-уведомления с использованием TLS и PHP?

Мое приложение все еще находится в разработке, и я использовал это руководство для отправки push-уведомлений iOS с использованием 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);

Но это все еще не работает. У вас есть предложение, чтобы это исправить?

6

Решение

$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

3

Другие решения

<?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);
2

Вот несколько советов, которые должны помочь вам разобраться:

  1. Идти к entrust.net/downloads/root_request.cfm и скачать entrust_2048_ca.cer

  2. Добавьте следующий код:
    stream_context_set_option ($ ctx, ‘ssl’, ‘cafile’, ‘entrust_2048_ca.cer’);

  3. Убедитесь, что путь правильный: ‘../folder/file/ck.pem’?

  4. Переключитесь и попробуйте обе песочницы и живые ссылки ssl.

  5. Переключите dev и production pem и попробуйте оба варианта.

0
По вопросам рекламы [email protected]