2013-09-26 2 views
4

Да: в этом вопросе много дубликатов, но ни один из ответов не помог.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, чтобы убедиться: соединение было в порядке.

Стало очевидным: это проблема с сертификатом.

ответ

7

Кажется, что aps_production.cer не следует handeled так же, как aps_development.cer

Здесь приходит RTM moment.

Скачать и установить сертификат в связке ключей (двойное нажатие aps_production.cer)

Экспорт версию сертификата aps_production .p12 (вы также установить пароль здесь) из Keychain Access.

Преобразование в формат .pem с помощью этой команды (вы должны ввести пароль здесь):

openssl pkcs12 -in aps_production.p12 -out final_aps_production.pem -nodes 

И вуаля - все начали работать, и я снова счастливый автофургоне.

Есть вопросы, связанные с инструкциями Джереми о том, как экспортировать сертификат & ключ here on SO.

+1

Вы экспортируете .p12 самого СЕРТИФИКАТА или КЛЮЧ для сертификата? Это то, что вы имеете в виду, они не должны обрабатываться аналогичным образом? – Jeremy

+1

Мое выражение было неловким здесь - возможно, оба сертификата могут быть установлены одинаково. В этом последнем варианте сертификат сначала устанавливается в keychain (OSX), а затем экспортируется вместе с ключом. Гораздо меньше, чтобы пойти не так. –

+4

Я мог бы поцеловать тебя – Jeremy

Смежные вопросы