Да: в этом вопросе много дубликатов, но ни один из ответов не помог.ApnsPHP: Push-уведомления, работающие в разработке, но не в производстве
Я следую за этим замечательным tutorial by Ali Hafizji on using APNS service for push notifications.
Тестирование 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 = new ApnsPHP_Push(ApnsPHP_Abstract::ENVIRONMENT_SANDBOX,'final_aps_development.pem');
$push->setRootCertificationAuthority('entrust_root_certification_authority.pem');
$push->setProviderCertificatePassphrase('mypassword');
...
Sidenote: я взял entrust_root_certification_authority.pem от https://github.com/jonathanrcarter/push2press, правильный адрес, чтобы искать это, вероятно, be https://www.entrust.net/downloads/binary/entrust_2048_ca.cer (они все равно).
В этом случае приложение запускалось в режиме отладки (на устройстве, запускалось с XCode), и все работало нормально.
Тестирование APNS в режиме производства:
Для проверки APNs в производственном режиме я архивировать приложение для распространения AdHoc и установил его на устройство с iPhone Configuration Utility.
Я выполнил ту же процедуру с aps_production.cer
, чтобы сделать final_aps_production.pem
.
Взрыва, то PHP-скрипт, который вызывается для отправки уведомлений отжимания вернулся 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 ....
погуглить вокруг (есть много людей с этой проблемой) доказал fruitle песчаники
Много разных советов, таких как, например, так, чтобы изменить права доступа к каталогу с сертификатами на 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
не уходит.
Конечно я также уверен, что, когда я тестировал режим производства правильного устройство APNs маркера - устройства APNs лексемы в отладке и режиме производства не то же самое - было использовано.
В любом случае: токены не могут быть проблемой, так как мой скрипт отправки уведомлений не может даже подключиться к ssl://gateway.push.apple.com:2195
.
Пробовал подключать ssl://gateway.push.apple.com:2195
через telnet
, чтобы убедиться: соединение было в порядке.
Стало очевидным: это проблема с сертификатом.
Вы экспортируете .p12 самого СЕРТИФИКАТА или КЛЮЧ для сертификата? Это то, что вы имеете в виду, они не должны обрабатываться аналогичным образом? – Jeremy
Мое выражение было неловким здесь - возможно, оба сертификата могут быть установлены одинаково. В этом последнем варианте сертификат сначала устанавливается в keychain (OSX), а затем экспортируется вместе с ключом. Гораздо меньше, чтобы пойти не так. –
Я мог бы поцеловать тебя – Jeremy