Надежность C2DM

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

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

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

Я сам рассмотрел несколько альтернатив: XMPP через asmack , Parse , Deacon , Urban Airship и MQTT .

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

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

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

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

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

  • С надежностью C2DM не является гарантией. Лучше всего иметь сообщение ACK или каким-то образом, в котором вы (отправитель) понимаете, что сообщение было получено успешно.
  • Также сделайте так, чтобы правильно переопределить класс onRegister, потому что устройство Reg ID продолжает перетасовывать.
  • Наконец, если вы планируете регулярно отправлять обновления, я бы предпочел опрос на C2DM только из-за количества требований, чтобы заставить его работать, в то время как надежность и конечный контроль все еще не гарантированы.

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

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

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

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

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

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

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

Для возобновления: обязательно проверьте сетевые конфигурации.

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