Надежность C2DM - PullRequest
       0

Надежность C2DM

3 голосов
/ 27 января 2012

У меня проблемы с C2DM. Иногда работает отлично, иногда мои сообщения просто не толкаются. Есть ли надежный способ обеспечить это соединение? Чтобы вытащить сообщения. Я где-то читал, что Google постоянно поддерживает низкоскоростное TCP-соединение с их сервером. Итак, я предполагаю, что при переключении между типами сети TCP-соединение обрывается, и Android пытается восстановить соединение с C2DM-серверами. Так что это может дать сбой в WiFi с ограниченной сетью. Это неправильное предположение?

Я заметил с WhatsApp, что иногда по WiFi я не получаю сообщения. Когда я переключаюсь на 3G, я обычно получаю их в момент переключения. Какие советы из вашего опыта с C2DM вы бы предложили?

Ответы [ 8 ]

3 голосов
/ 21 февраля 2012

C2DM не подходит для критически важных частей вашего приложения, поскольку Google в настоящее время не предлагает SLA или платные уровни, которые гарантируют вам надежное обслуживание и пропускную способность.

Я сам рассмотрел несколько альтернатив: XMPP через asmack , Разбор , Диакон , Городской дирижабль и MQTT .

Через некоторое времячитая и экспериментируя, я решил пойти с MQTT.Это очень легкий протокол телеметрии, изобретенный в IBM, который отлично вписывается в сценарий push-уведомлений Android.Я рекомендую вам попробовать, вот хороший пост в блоге: Использование MQTT в мобильных приложениях для Android .

Надеюсь, это поможет.

2 голосов
/ 27 января 2012

C2DM не гарантирует, что ваше сообщение будет доставлено, и ваше приложение не должно предполагать, что для правильной работы. Следовательно, ваше C2DM-сообщение никогда не должно содержать сами данные, а скорее уведомление о наличии доступных данных. Другими словами, потеря сообщения C2DM никогда не должна приводить к потере данных вашим приложением; самое большее, это должно привести к тому, что потребуется больше времени, чтобы заметить, что на вашем сервере доступна определенная часть данных.

Типичное приложение должно время от времени (длительное время) подключаться к своему серверу для получения сообщений, даже при использовании C2DM, чтобы охватить случай, когда сообщения C2DM могут не доставляться.

В зависимости от конфигурации сети устройство может не иметь возможности получать сообщения C2DM; ограниченные брандмауэры или другие странные настройки WiFi могут сделать это.

1 голос
/ 03 августа 2012

Проверяли ли вы каждые 15 минут соединения? Я создал задачу расписания, чтобы отправить сообщение. Я использую NotifyMyAndroid, чтобы подтолкнуть его. C2DM иногда отправляет сообщение через 10 минут после не мгновенно. Но иногда это происходит примерно через секунду.

1 голос
/ 01 марта 2012

Я сам боролся с той же проблемой. Поведение, которое вы описываете, является точным. Я разрабатываю приложение, которое использует c2dm в основном с подключением Wi-Fi, и мне пришлось реализовать AsyncTask для периодического (минут через полторы) вызова WifiManager.reassociate () (выключение и повторное включение Wi-Fi вызывает появление всех ожидающих уведомлений это то, что вдохновило это решение), так что я могу держать уведомление о прибытии как можно точнее. Однако не уверен в правильности этой практики.

1 голос
/ 21 февраля 2012
  • С C2DM надежность не гарантируется.Поэтому лучше всего иметь ACK-сообщение или каким-либо другим способом, которым вы (отправитель) понимаете, что сообщение было успешно получено.
  • Также сделайте необходимым корректное переопределение класса onRegister, поскольку Reg ID устройства продолжает перемешиваться.
  • Наконец, если вы планируете регулярно отправлять обновления, я бы предпочел опрос C2DM только из-за большого количества требований для его функционирования, в то время как надежность и окончательный контроль все еще не гарантированы.
0 голосов
/ 30 марта 2012

Некоторые APN работают лучше, чем другие с C2DM.Google "gtalk apn", например, чтобы найти форумы о влиянии APN на C2DM.

0 голосов
/ 17 марта 2012

После долгого исследования «всего интернета», я нашел его. Как я уже писал ранее, я сам боролся с этой проблемой и обнаружил, что это не проблема C2DM или даже проблема реализации. Это была просто неправильная настройка маршрутизатора или брандмауэра. Android использует постоянное TCP-соединение с механизмом поддержания активности пульса, чтобы гарантировать, что соединение остается в рабочем состоянии. Google использует состояние соединения, чтобы определить, находится ли ваше устройство в режиме ожидания или нет. Но если у вашего маршрутизатора есть политика защиты, которая проверяет наличие «неиспользуемых» соединений и завершает их, это не сработает. Уведомления Android должны быть доставлены (близко к) мгновенно. Я проверил это в своей школьной сети и домашней сети, используя два разных поведения.

Для возобновления: обязательно проверьте настройки сети.

0 голосов
/ 04 февраля 2012

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

Я считаю, что это число составляет около 80%.К счастью, этого достаточно для сферы применения.

Wi-Fi не должен мешать C2DM принимать сообщения.По крайней мере, пока телефон активен.

Что происходит, так это то, что Android выключает Wi-Fi после того, как телефон некоторое время находится в режиме ожидания.Сообщения не будут доступны в этот период, просто потому что нет подключения к интернету.Сразу после пробуждения телефона пользователь должен получить сообщения.

...