ApnsPHP: Push-уведомления, работающие в разработке, но не в производстве
Да: на этот вопрос много дубликатов, но ни один из ответов не помог.
Я следую этому замечательному руководству Али Хафидзи об использовании службы APNS для push-уведомлений .
Тестирование APNS в режиме разработки :
- скачать
aps_development.cer
- экспортировать закрытый ключ для сертификата (
aps_development_key.p12
)
Затем я объединил их, используя следующие команды (используя терминал):
openssl x509 -in aps_development.cer -inform der -out aps_development.pem openssl pkcs12 -nocerts -out aps_development_key.pem -in aps_development.p12 cat aps_development.pem aps_development_key.pem > final_aps_development.pem
И (используя ApnsPHP на сервере), я смог успешно отправить push-уведомление с этой конфигурацией:
... $push = new ApnsPHP_Push(ApnsPHP_Abstract::ENVIRONMENT_SANDBOX,'final_aps_development.pem'); $push->setRootCertificationAuthority('entrust_root_certification_authority.pem'); $push->setProviderCertificatePassphrase('mypassword'); ...
Сиденит: я взял entrust_root_certification_authority.pem с https://github.com/jonathanrcarter/push2press , правильный адрес для поиска, вероятно, будет https://www.entrust.net/downloads/binary/entrust_2048_ca.cer ( они все равно одно и то же).
В этом случае приложение работало в режиме отладки (на устройстве, запускалось с XCode), и все работало нормально.
Тестирование APNS в режиме производства :
Чтобы протестировать APNS в режиме производства, я заархивировал приложение для распространения AdHoc и установил его на устройстве с помощью iPhone Configuration Utility .
Я выполнил ту же процедуру с помощью aps_production.cer
чтобы сделать final_aps_production.pem
.
Bang, скрипт php, вызываемый для отправки push-уведомлений, возвратил код состояния HTML 500.
Генерация $push
была изменена для режима производства:
... $push = new ApnsPHP_Push(ApnsPHP_Abstract::ENVIRONMENT_PRODUCTION,'final_aps_production.pem'); $push->setRootCertificationAuthority('entrust_root_certification_authority.pem'); $push->setProviderCertificatePassphrase('mypassword'); ...
Быстрый поиск /var/log/apache2/error.log
показал проблему:
PHP Fatal error: Uncaught exception 'ApnsPHP_Exception' with message 'Unable to connect to 'ssl://gateway.push.apple.com:2195': (0)' in /var/www/gettapro/mobile/ApnsPHP/Abstract.php:398\nStack trace:\n#0 /var/www/gettapro/mobile/ApnsPHP/Abstract.php(334): ApnsPHP_Abstract->_connect()\n#1 ....
Гуглинг вокруг (есть много людей, имеющих эту проблему) оказался бесплодным.
Множество разных советов, таких как, например, так, чтобы изменить права доступа к файлу каталога, содержащего сертификаты, на 775 … ни один из предложений не работал для меня.
Я также пробовал это изменение в ApnsPHP/Abstract.php
(предлагается здесь: https://github.com/duccio/ApnsPHP/issues/29 ), но без успеха.
$streamContext = stream_context_create(array('ssl' => array( //'verify_peer' => isset($this->_sRootCertificationAuthorityFile), 'cafile' => $this->_sRootCertificationAuthorityFile, 'local_cert' => $this->_sProviderCertificateFile )));
Это надоедливое ApnsPHP_Exception
не ApnsPHP_Exception
.
Конечно, я также убедился, что, когда я тестировал режим производства, использовалось правильное токеновое устройство APNS – токены APNS устройства в режиме отладки и производства – не были одинаковыми .
В любом случае: токены не могут быть проблемой, поскольку мой скрипт отправки уведомлений не может даже подключиться к ssl://gateway.push.apple.com:2195
.
Попробовал подключить ssl://gateway.push.apple.com:2195
через telnet
чтобы убедиться: соединение было прекрасным.
Это стало очевидным: это проблема с сертификатом.
One Solution collect form web for “ApnsPHP: Push-уведомления, работающие в разработке, но не в производстве”
Кажется, что aps_production.cer
не следует обрабатывать так же, как aps_development.cer
Здесь наступает момент RTM .
Загрузите и установите сертификат в aps_production.cer
ключей (двойной щелчок aps_production.cer
)
Экспортируйте .p12
версию сертификата aps_production (вы также устанавливаете здесь пароль) из Access Keychain.
Преобразуйте его в формат .pem
с помощью этой команды (здесь вам нужно будет ввести пароль):
openssl pkcs12 -in aps_production.p12 -out final_aps_production.pem -nodes
И вуаля – все началось, и я снова счастливый турист.
По Джереми есть отличные инструкции, подобные тому, как экспортировать сертификат и ключ здесь на SO .