Каким образом Push Notification Service знает куда отправлять push?
Все мы знаем общие принципы работы push-уведомлений. А меня интересует такой вопрос: Каким образом сервер знает куда отправлять push?
Я предполагаю что работает это так:
- На стороне клиента (устройство на Android/IOS/WP) в фоне постоянно работает некий процесс. Назовем его getPush. При появлении интернет-соединения, getPush просыпается и устанавливает соединение с Push Notification Service (PNS). Далее getPush посылает запрос на новые данные, если данных нет то getPush засыпает, если данные есть он их принимает, передает в приложение и засыпает. Потом через некий промежуток времени getPush просыпается и процесс повторяется.
- Или при появлении интернет-соединения, getPush просыпается, устанавливает соединение с PNS и не обрывая соединения getPush переходит в состояние "Listening" (т.е. слушает сообщения от PNS). Как только появляются новые данные PNS отправляет их в getPush. Далее getPush принимает эти данные, передает в приложение и обратно переходит в состояние "Listening".
Как вы думаете какой вариант правильный? Или может я ошибаюсь и принцип работы совершенно другой?
"A push design differs from its opposite, a pull design, in that the recipient of the notification passively listens for updates rather than actively polling for them."
Each device establishes an accredited and encrypted IP connection with the service and receives notifications over this persistent connection.
Просто реализация соединения с сервером APNs возложена на соответствующую часть самой iOS/OSX. Устанавливается обычное постоянное (P2P) сокетное соединение поверх TLS. Каждое устройство получает токен (идентификатор). APNs знает, за каким девайсом какой токен закреплен. Когда вы отправляете PUSH уведомление через какой-то сервис, то у вас есть токен, вы отправляете токен и полезную нагрузку в APNs, а уже служба APNs ищет активное соединение и отправляет пакет с данными на устройство. Если соединения нет, то APNs ставит уведомление в очередь, как только соединение установлено, на девайс уходит уведомление. Просто вместо открытия нескольких соединений используется только одно на устройство. Таким образом экономится трафик и энергия.
Philipp T: "Устанавливается обычное постоянное (P2P) сокетное соединение поверх TLS." - под этим вы имеете ввиду что висит демон и ждет соединения, после установки его он не обрывая соединения слушает ответа apns, т.е. соединение постоянно активно?
Виталий: насколько я это понял, так. Мне кажется другого способа и нет. Открыл соединение и ждешь ответ. Ну keepalive отправляешь раз в минуту, чтобы не закрылось. Как только пакет пришел, разбудил приложение и отдал ему данные из пакета.