Хобрук: Ваш путь к мастерству в программировании

Надежность C2DM

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

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


Ответы:


1

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

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

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

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

21.02.2012

2

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

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

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

26.01.2012
  • Я просто использую C2DM, чтобы разбудить свою службу, иначе она не несет никакой информации, но... неплохая идея на самом деле время от времени будить службу на всякий случай? Это то, что вы предлагаете? 27.01.2012
  • Что меня действительно интересует, так это... есть ли способ сказать... Привет, C2DM, ты там? 27.01.2012

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

    4

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

    01.03.2012
  • Вы можете убить соединения других приложений с помощью этой техники. Например, вы отменяете загрузки в браузерах или обновления приложений в Google Play. 06.07.2012

  • 5

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

    03.08.2012

    6

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

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

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

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

    04.02.2012

    7

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

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

    17.03.2012

    8

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

    30.03.2012
    Новые материалы

    Пять вещей, о которых вы должны ДЕЙСТВИТЕЛЬНО побеспокоиться в связи с ИИ
    Несмотря на то, что циркулирует много неточной информации об ИИ, важно исправить частые заблуждения. Многие могут быть обеспокоены тем, что их в конечном итоге заменят роботом, или..

    Тестирование ответов на вопросы на основе BERT по статьям о коронавирусе
    Введение В настоящее время большая часть мира затронута пандемией COVID-19 . Для многих из нас это означало домашний карантин, социальное дистанцирование, перебои в рабочей среде. Я..

    Библиотеки PyTorch и Python для машинного обучения: приложения в здравоохранении с обнимающим лицом…
    В сфере машинного обучения Python выделяется благодаря своей универсальности и набору предлагаемых библиотек. Развитие машинного обучения в здравоохранении можно частично объяснить простотой и..

    «Что за…» очень хорошо представляет мое выражение лица после того, как я увидел это!
    «Что за…» очень хорошо представляет мое выражение лица после того, как я увидел это!

    5 вещей, которые я сделал, чтобы стать профессиональным разработчиком JavaScript
    Чтобы стать профессиональным JS-разработчиком: 1. Практикуйтесь в рутине, 2. Работайте над проектами, 3. Придерживайтесь одного языка, 4. Наблюдайте за чужим кодом, 5. Будьте последовательны..

    От теории к практике: пошаговое руководство по реализации наивного Байеса
    Вы когда-нибудь застревали в проекте классификации, не зная, как точно предсказать результаты для ваших данных? Вы искали более простой и интуитивно понятный алгоритм, который поможет вам достичь..

    #093 | Моделирование вспышки эпидемии с помощью JavaScript — Часть 3
    TLDR: Я сделал симуляцию вспышки эпидемии, в которую можно поиграть здесь . Мой холст, моя сцена Мой HTML — это всего лишь один div с классом stage, и вот как я настроил на нем свой объект..