2014-03-28 3 views
18

Я создал приложение для отправки удаленных уведомлений с веб-сервера. Когда я тестировал приложение в режиме разработки, все уведомления поступали правильно на телефоне, после выпуска AppStore приложение больше не получало уведомлений.APNS Push Notifications не работает над производством

Вот это то, что я сделал:

  1. Создано секретный ключ для производства и один для развития.
  2. Сгенерировано на моем идентификаторе приложения два SSL-сертификата, передав предыдущий файл CertFile Generated. Я на 100% уверен, что правильно сгенерировал 2 ключа и правильно их передал, чтобы загрузить сертификат SSL из Dev Center в AppID.
  3. Создал файл .pem для разработки и один для производства (путем преобразования файла .p12, извлеченного из моего KeyChain и т. Д. И т. Д.).
  4. создал 2 разные профиля обеспечения один для развития и один для производства связан с AppID шага 1.
  5. Подпись приложение в параметрах сборки с правильными Provisioning профилей, созданных на шаге 4.
  6. создания веб-приложений для улавливать и хранить пользователей токенов.
  7. Создал страницу php для проверки отправки Push Notification.

Вот это то, что я тестировал:

  1. Испытано развитие генерируется .pem файл с телнет на песочнице связи с успешным ответом.
  2. Протестировано созданное производством .pem-файл с помощью telnet на производственной ссылке с успешным ответом.
  3. Я на 100% уверен, что сохранил на своем веб-приложении маркер разработки моего iPhone.
  4. Я на 100% уверен, что сохранил на своем сервере веб-приложений производственный токен моего iPhone.
  5. Я на 100% уверен, что передаю с моей страницей php правильное сообщение на Apple Server (как для разработки, так и для производства).
  6. Страница php всегда возвращает успешное сообщение от Apple Server (как для разработки, так и для производства).

Вот как я подписываю приложение на Xcode:

enter image description here enter image description here enter image description here enter image description here

Вот код страницы 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.

Я готов воздать должное каждому из вас, кто помогает мне найти решение моей проблемы!

+0

Для вашей информации скрипт PHP возвращает сообщение успешно отправлен, даже если токен ошибочен или истек. – rjobidon

ответ

15

Ссылка, на которую вы указали, - это ссылка для APNS Sandbox. Производство APNS ссылка как на Apple, documentation является:

Доступ к производственной среде на gateway.push.apple.com, исходящий TCP-порт 2195.

Несколько вещей, чтобы проверить:

  1. Ваш AppId включен для распространения APNS.
  2. Вы создали сертификат распространения APNS SSL и установлен на вашей машине сборки (для представления в App Store).
  3. Установлен сертификат SSL на шаге 2 на вашем сервере.
  4. Вы не ошибаетесь, используя Разработка SSL Сертификат APNS.
+0

На самом деле я использую производственную ссылку (gateway.push.apple.com), я допустил ошибку в своем первом сообщении, вставив ее в один из них. – prelite

+0

1. Включено 2. Да 3. Да 4. Нет ... Я попробовал сертификат с сервером telnet и apple успешно ответил ... – prelite

+0

Я добавил дополнительную информацию о том, что я сделал, не могли бы вы мне помочь? – prelite

11

Значок устройства для производства и песочница отличаются для того же устройства.

Так что попробуйте получить маркер устройства с помощью сертификатов Adhoc или Distribution и использовать сгенерированный токен на производстве, это сработало для меня.

1

Я просто столкнулся с той же проблемой. Push-уведомления поступают в режим разработки, а не в Production. Я также проверил все несколько раз и был уверен, что все в порядке.

Но это не так. Это был первый шаг в этом процессе. Создание csr. Я был уверен, что мне не нужно создавать файл csr для разработки и производства и в конечном итоге использовать тот же файл csr для обоих сертификатов. Не работает ...

Возможно, кто-то в будущем совершит ту же ошибку и сохранит некоторое время.

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