Я создал приложение для отправки удаленных уведомлений с веб-сервера. Когда я тестировал приложение в режиме разработки, все уведомления поступали правильно на телефоне, после выпуска AppStore приложение больше не получало уведомлений.APNS Push Notifications не работает над производством
Вот это то, что я сделал:
- Создано секретный ключ для производства и один для развития.
- Сгенерировано на моем идентификаторе приложения два SSL-сертификата, передав предыдущий файл CertFile Generated. Я на 100% уверен, что правильно сгенерировал 2 ключа и правильно их передал, чтобы загрузить сертификат SSL из Dev Center в AppID.
- Создал файл .pem для разработки и один для производства (путем преобразования файла .p12, извлеченного из моего KeyChain и т. Д. И т. Д.).
- создал 2 разные профиля обеспечения один для развития и один для производства связан с AppID шага 1.
- Подпись приложение в параметрах сборки с правильными Provisioning профилей, созданных на шаге 4.
- создания веб-приложений для улавливать и хранить пользователей токенов.
- Создал страницу php для проверки отправки Push Notification.
Вот это то, что я тестировал:
- Испытано развитие генерируется .pem файл с телнет на песочнице связи с успешным ответом.
- Протестировано созданное производством .pem-файл с помощью telnet на производственной ссылке с успешным ответом.
- Я на 100% уверен, что сохранил на своем веб-приложении маркер разработки моего iPhone.
- Я на 100% уверен, что сохранил на своем сервере веб-приложений производственный токен моего iPhone.
- Я на 100% уверен, что передаю с моей страницей php правильное сообщение на Apple Server (как для разработки, так и для производства).
- Страница php всегда возвращает успешное сообщение от Apple Server (как для разработки, так и для производства).
Вот как я подписываю приложение на Xcode:
Вот код страницы PHP для отправки уведомлений:
$ctx = stream_context_create();
//stream_context_set_option($ctx, 'ssl', 'passphrase', 'development_pwd');
//stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck_development.pem');
//$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); //test
stream_context_set_option($ctx, 'ssl', 'passphrase', 'production_pwd');
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck_production.pem');
$fp = stream_socket_client('ssl://gateway.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); //production
echo "<p>Connection Open</p>";
if(!$fp){
echo "<p>Failed to connect!<br />Error Number: " . $err . " <br />Code: " . $errstrn . "</p>";
return;
} else {
echo "<p>Sending notification!</p>";
}
$i = 0;
foreach ($deviceToken as $dt) {
$dt = str_replace(' ' , '' , $dt);
$msg = chr(0) . pack('n',32) . pack('H*', $dt) . pack('n',strlen($payload)) . $payload;
echo "<p>" . $i . " - Message sent: " . $payload . "<br />Token: ". $dt . "<br />***" . $msg . "***</p>";
$result = fwrite($fp, $msg, strlen($msg));
$i++;
if (!$result)
echo '<p>Message not delivered ' . PHP_EOL . '!</p>';
else
echo '<p>Message successfully delivered ' . PHP_EOL . '!</p>';
}
fclose($fp);
echo "<p>Total Notifications Sent: " . $i . "</p>";
echo "<p>Connection Closed!</p>";
}
?>
Выводы: У меня есть Test Ap p на моем ПК, которые получают уведомления APNS Push. У меня есть то же самое приложение, выпущенное в App Store, которое не получает уведомления APNS Push.
Я действительно сделал все, что в моих силах, чтобы исправить эту проблему и прочитать около тысячи страниц форумов, stackoverflow и Apple Documentations.
Я готов воздать должное каждому из вас, кто помогает мне найти решение моей проблемы!
Для вашей информации скрипт PHP возвращает сообщение успешно отправлен, даже если токен ошибочен или истек. – rjobidon