PushSharp — несколько недопустимых токенов не вызывают делегатов ответа

У меня есть приложение, которое отправляет push-уведомления на устройства iOS с помощью PushSharp. Это служба Windows. Я пытаюсь протестировать его в больших масштабах с большими списками недействительных токенов устройств (у меня не так много действительных токенов).

Проблема в том, что события PushBroker не срабатывают для большинства токенов. Некоторые токены (очень немногие) вызывают запуск метода OnNotificationFailed (конечно, с сообщением «Неверный токен»).

Это может быть известное поведение apns в этом сценарии, для которого PushSharp ведет себя не так, как я ожидал. Я рассчитываю на эти ответы в своей логике.

Целесообразно ли проводить такой тест?

Стоит ли ожидать такого поведения? Что это значит, если PushBroker не запускает свои события?

спасибо за любое предложение или комментарий у вас есть.


person gilp    schedule 03.04.2014    source источник


Ответы (1)


Хотя я не изучал код PushSharp, я реализовал сервер, который взаимодействует с сервером APNS, поэтому могу назвать несколько возможных причин такого поведения.

Когда сервер Apple APNS обнаруживает недопустимый токен устройства (или любой другой тип недопустимых данных, например, слишком длинную полезную нагрузку), он записывает ответ об ошибке в сокет и закрывает соединение.

Теперь, если вы попытаетесь отправить 10 уведомлений и только после 10-го сообщения вы получите ответ об ошибке (через OnNotificationFailed в вашем случае), в котором говорится, что 5-е сообщение не удалось, это означает, что Apple никогда не обрабатывала сообщения с 6 по 10 (так что, если вы ожидали OnNotificationFailed срабатывать для некоторых из них, поэтому этого не произошло). Эти сообщения должны быть повторно отправлены. Я не знаю, обрабатывает ли PushSharp эту повторную отправку автоматически или вам нужно сделать это самостоятельно.

В дополнение к этому усложнению, в некоторых случаях (по крайней мере, когда я экспериментировал с недопустимыми токенами) вы (или PushSharp в вашем случае) могли не прочитать ответ об ошибке от Apple, и в этом случае вы только заметите, что что-то не так, когда соединение закрывается (т.е. вы получите ошибку при попытке отправить сообщение). В этом случае вам нужно открыть новый сокет, но вы понятия не имеете, какое сообщение вызвало сбой и какие сообщения следует отправить повторно.

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

person Eran    schedule 03.04.2014
comment
Спасибо. Итак, как я могу протестировать свой сервис с несколькими токенами? - person gilp; 07.04.2014
comment
Я понимаю, что не могу реально протестировать сервис с недействительными токенами, но хочу протестировать сервис на отправку большого количества push-уведомлений. Получу ли я ответы на все запросы, если отправлю 10 000 уведомлений для одного и того же действительного устройства deviceToken? Я попытался выполнить аналогичный тест с GCM с действительным идентификатором регистрации — 10 000 запросов к одному и тому же идентификатору регистрации. У меня нет ответов на все запросы. Как я могу протестировать эту службу для большого количества токенов, не имея много уникальных токенов? - person gilp; 07.04.2014
comment
@gilp Apple не возвращает ответ, если нет ошибки, поэтому вы не получите никакого ответа, если используете действительные токены. Единственный способ протестировать его на большое количество уведомлений без большого количества действительных токенов — написать процесс, который имитирует сервер APNS (т. е. принимает входящие TLS-соединения, а затем анализирует входящие данные в соответствии с двоичным форматом APNS). Это нелегко сделать. Другой вариант — протестировать весь процесс отправки нескольких уведомлений, кроме фактической отправки. Для этого могут потребоваться изменения в исходном коде PushSharp. - person Eran; 07.04.2014