ApnsPHP: Push-уведомления, работающие в разработке, но не в производстве

Да: на этот вопрос много дубликатов, но ни один из ответов не помог.

Я следую этому замечательному руководству Али Хафидзи об использовании службы APNS для push-уведомлений .

  • Ошибка 502 в nginx + php5-fpm
  • PHP __PHP_Incomplete_Class Объект с моими данными $ _SESSION
  • Авторизация страницы поклонника Facebook для обновлений статуса
  • В PHP5, следует ли использовать Исключения или trigger_error / set_error_handler?
  • Лучший способ управления долговременным скриптом php?
  • Как защитить страницу только для зарегистрированных пользователей?
  • Тестирование 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 .

    PHP is the Best Programming Language in the world.