Подтвердить что ты не робот

Уведомления APNS Push не работают над производством

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

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

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

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

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

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

enter image description hereenter image description hereenter image description hereenter 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>";
}
?>

Выводы: У меня есть тестовое приложение на моем ПК, которое получает уведомления APNS Push. У меня есть точно такое же приложение, выпущенное в App Store, которое не получает уведомления APNS Push.

Я действительно сделал все, что в моих силах, чтобы исправить эту проблему и прочитать около тысячи страниц форумов, stackoverflow и Apple Documentations.

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

4b9b3361

Ответ 1

Вы упомянули ссылку Sandbox APNS. Производственная ссылка APNS соответствует Apple documentation:

Вы получаете доступ к рабочей среде на gateway.push.apple.com, исходящий TCP-порт 2195.

Несколько вещей для проверки:

  • Ваш AppId включен для APNS распространения.
  • Вы создали сертификат распространения APNS SSL и установлен на вашей машине сборки (для представления в App Store).
  • Вы установили SSL-сертификат на шаге 2 на своем сервере.
  • Вы не ошибаетесь, используя сертификат SSL для разработки APNS.

Ответ 2

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

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

Ответ 3

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

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

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