Максимальное количество устройств для отправки на сервер APNS - PullRequest
4 голосов
/ 25 июля 2011

Наш скрипт push-уведомлений, который работал почти год, внезапно перестал работать.Сценарий выполняет следующие действия:

  1. Запрашивает в БД список токенов устройства iPhone

  2. Открывает сокет-соединение SSL с живым сервером Apple APNS

    $ctx = stream_context_create();
    stream_context_set_option($ctx, 'ssl', 'local_cert', $apnsCert);
    stream_context_set_option($ctx, 'ssl', 'passphrase', $pass);
    $fp = stream_socket_client($apnsHost, $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
    
  3. создает полезную нагрузку с сообщением размером 255 байт

    $payload = '{
      "aps": {
         "alert": "' . $message . '",
         "badge": 1,
         "sound": "default"
      }
    }';
    
  4. Переходит через каждое устройство и записывает полезную нагрузку в открытуюсоединение.

    $msg = chr(0) . pack("n",32) . pack('H*', str_replace(' ', '', $deviceToken)) . pack("n",strlen($payload)) . $payload;
    fwrite($fp, $msg);
    
  5. Соединение затем закрывается.

    fclose($fp);
    

Так что мой вопрос таков: ничего в сценарии нетизменилось, но изменился размер базы данных.Я создал веб-интерфейс, который позволяет пользователю отправлять полезную нагрузку на все устройства iphone, и при его запуске отправка / загрузка занимает всего несколько секунд.Возможно ли, однако, что количество устройств в БД (около 3500) создает проблему?

Какое максимальное количество устройств, на которые я могу отправить push-уведомление при записи в сокет?Существует ли максимум или предел?

Ответы [ 3 ]

5 голосов
/ 11 ноября 2012

Проблема была не в количестве устройств, отправляемых в APNS. Проблема оказалась в том, что Apple изменила свой API. Теперь вам нужно проверить каждое устройство, чтобы убедиться, что оно все еще действует (то есть, если они запрещают push-уведомления, если устройство удалило приложение и т. Д.). Если устройство больше не принимает push-уведомления от вашего приложения, и вы все равно отправляете ему уведомление, Apple немедленно прекращает подключение к вашему гнезду APNS. Теперь у меня есть cronjob, который запускает программу один раз в день, которая проверяет и удаляет любые устройства из моей базы данных, которые больше не принимают push-уведомления (у Apple есть этот список). Но будьте осторожны - как только вы извлекаете список отключенных идентификаторов устройств от Apple, Apple удаляет их со своего сервера, и вы можете никогда извлекать его снова.

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

3 голосов
/ 12 ноября 2011

Действительно, исходя из опыта, кажется, что соединения с APNS будут прерываться после того, как через него будет проталкиваться некоторое количество уведомлений. В нашей собственной библиотеке APNS (http://code.google.com/p/javapns/), многопоточный механизм передачи, включенный в библиотеку, автоматически перезапускает соединения после отправки 200 уведомлений (кажется, магическое число после проб и ошибок). Так как мы представили эту функцию (наряду с некоторым другим незначительным восстановлением comlink параметры), частота неудачных уведомлений для большого количества уведомлений обнуляется.

0 голосов
/ 11 августа 2011

Та же проблема .. Похоже, ограничение в 2000 устройств - это максимум.Итак, 2000 (или менее) токенов по сокету открыты.Попробуйте и посмотрите!

...