Поддерживает ли Android пуш-уведомление в режиме реального времени?

343

Недавно я узнал о способности приложений для iPhone получать почти мгновенные уведомления о приложениях, уведомления о приложениях .

Это обеспечивается в форме push-уведомлений, специального протокола, который поддерживает постоянную связь с iPhone и передает двоичные пакеты в приложение, которое невероятно быстро выскакивает , в течение 0,5 - 5 секунд от приложения сервера до приложения телефона время отклика. Это отправляется как данные, а не как SMS, в очень маленьких пакетах, которые оплачиваются как часть плана данных, а не как входящие сообщения.

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

  • Не SMS-сообщение, а какое-то решение, управляемое данными
  • В режиме реального времени, насколько это возможно
  • Масштабируемость, т. Е. Как серверная часть мобильного приложения, я мог бы уведомить тысячи экземпляров приложения за считанные секунды

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

J Pimmel
источник
3
Уведомление для gmail и gchat обычно находится в пределах этого порога. Должен быть способ воспроизвести это в вашем собственном приложении.
Дана Нормальная
Да, есть библиотека Android, которая делает push-сообщения очень простыми ... просто включите библиотеку Jigy Droid Notifications в ваше приложение, и оттуда всего около 10 строк кода ... надеюсь, это поможет :)
Кори Харден,
Проверьте Pushy ( pushy.me ) для шлюза push-уведомлений в реальном времени, который использует MQTT под капотом для повышения надежности. Полное раскрытие - я основал Пуши.
Elad Nava

Ответы:

215

Firebase Cloud Messaging FCM FAQ - это новая версия GCM. Он наследует основную инфраструктуру GCM для надежной доставки сообщений на Android, iOS и Chrome. Однако они продолжат поддерживать GCM, потому что многие разработчики используют GCM SDK сегодня для обработки уведомлений, а обновление клиентских приложений требует времени.

По состоянию на 26 июня 2012 г. Google Cloud Messaging является предпочтительным способом отправки сообщений в приложения, работающие на устройствах.

Ранее (а теперь и устарела) эта служба называлась « Обмен сообщениями с облака на устройство» .

J Pimmel
источник
14
Google предоставляет подробную документацию для реализации этого в вашем Android-приложении на Java по адресу code.google.com/android/c2dm, но их пример кода для связи с аспектом C2DM на стороне сервера отсутствует. Я написал выше учебник для этого аспекта здесь: blog.boxedice.com/2010/10/07/...
DavidM
2
Есть ли способ предложить push-уведомления пользователям с Android 2.2, но сделать такое же приложение работоспособным в старых дистрибутивах, просто без push-уведомлений?
OneWorld,
3
@OneWorld: да, как и любой другой метод обратной совместимости Android, используйте отражение, чтобы выбрать альтернативную стратегию, когда C2DM недоступен, подробнее см. На developer.android.com/resources/articles/…
Ли Райан
1
developer.android.com/videos/index.html#v=PLM4LajwDVc Презентация Google I / O 2010 о push-уведомлениях
вокилам
6
C2DM официально объявлен устаревшим с 26 июня 2012 г., используйте [Google Cloud Messaging для Android] ( взамен developer.android.com/guide/google/gcm/index.html
Mithun Sreedharan,
47

XMPP - это хорошее решение. Я использовал его для приложения Android, работающего в режиме реального времени. XMPP является мощным, легко расширяемым и простым в интеграции и использовании.

Существует множество бесплатных серверов XMPP (хотя из вежливости вы не должны злоупотреблять ими), и есть серверы с открытым исходным кодом, которые вы можете запускать на одном из ваших собственных серверов. OpenFire - отличный выбор.

Библиотека, которую вы хотите, не Smack, как отмечено выше, это aSmack . Но обратите внимание, это среда сборки - вам придется собирать библиотеку.

Вот расчет, который я сделал для влияния времени работы от батарей решения XMPP:

Клиент Android должен поддерживать постоянное TCP-соединение, периодически просыпаясь, чтобы отправить пульс на сервер XMPP.
Это явно налагает затраты с точки зрения использования энергии. Оценка этой стоимости представлена ​​ниже:

  • Использование аккумулятора емкостью 1400 мАч (поставляется в Nexus One и HTC Desire)
  • Свободное устройство, подключенное к сети 3G, использует приблизительно 5 мА
  • Цикл пробуждения, сердцебиения, сна происходит каждые 5 минут, занимает три секунды и использует 300 мА
  • Следовательно, стоимость использования батареи в час:
    • 36 секунд 300 мА = 3 мАч отправка сердцебиения
    • 3600 секунд 5 мА = 5 мАч на холостом ходу
    • 4:95 + 3 = 7: 95 мАч в сочетании
  • Батарея емкостью 1400 мАч работает в режиме ожидания примерно 11,6 дня, а при работе приложения - 7,3 дня, что примерно на 37% сокращает срок службы батареи.
  • Тем не менее, сокращение срока службы батареи на 37% представляет собой наихудший случай на практике, учитывая, что устройства редко полностью простаивают.
плоть
источник
2
Однако на практике телефон будет работать 3 часа, так как приложения делают это, так как сотни намерений запускаются, когда телефон просыпается или включается дисплей или изменяется состояние сети.
Месье
33

Недавно я начал играть с MQTT http://mqtt.org для Android как способ сделать то, что вы просите (то есть не SMS, а на основе данных, почти мгновенную доставку сообщений, масштабируемость, не опрос и т. Д.)

У меня есть сообщение в блоге с дополнительной информацией об этом на случай, если это будет полезно http://dalelane.co.uk/blog/?p=938.

(Примечание: MQTT - это технология IBM, и я должен отметить, что я работаю на IBM.)

dalelane
источник
Как mqtt делает это? Должен быть какой-то опрос? Даже яблоко должно опросить, но я думаю, что они делают только одно соединение за раз, поэтому не разряжают батарею так много ...
Janusz
3
Он делает это, открывая соединение TCP / IP и оставляя его открытым. Он не опрашивает, хотя ему иногда приходится отправлять небольшое сообщение ping по соединению, чтобы поддерживать его.
Далелан
MQTT - это определенно лучший способ, если отправка вашего push-сообщения через Google доставляет вам неудобства. Кроме того, у нас есть соглашения о неразглашении с нашими клиентами, которые запрещают использование облачных сервисов для обмена данными.
VH-NZZ
14

Взгляните на платформу Xtify . Похоже, это то, что они делают,

Питер
источник
12

Google обесценивает C2DM, но вместо него они представляют GCM (Google Cloud Messaging). Я не думаю, что у них есть какая-либо квота и она бесплатна! Это требует Android 2.2+, хотя! http://developer.android.com/guide/google/gcm/index.html

Уильям Л.
источник
8

Если вы можете зависеть от того, какие библиотеки Google существуют для вашего целевого рынка, то вы можете захотеть вернуться к функциональности GTalk (зарегистрировать ресурс под существующим именем пользователя - перехватывать сообщения по мере их поступления с BroadcastReceiver).

Если нет, и я ожидаю, что вы не можете , то вы в комплекте ваши собственные версии XMPP . Это боль, но ее можно облегчить, если XMPP поставляется отдельно как отдельная библиотека.

Вы также можете рассмотреть PubSubHubub , но я понятия не имею, его использование в сети. Я считаю, что он построен поверх XMPP.

jamesh
источник
Я думаю, что в статье говорится, что функциональные возможности всегда будут доступны, пока библиотеки gtalk находятся на устройстве. Есть ли у вас ресурсы с примерами, как на самом деле это сделать?
Януш
GTalk удален из SDK начиная с 1.0 (iirc).
MrSnowflake
8

Я смотрел на это, и PubSubHubBub, рекомендованный Jamesh, не вариант. PubSubHubBub предназначен для обмена данными между серверами.

«Я за NAT. Могу ли я подписаться на концентратор? Концентратор не может подключиться ко мне».

/ Anonymous

Нет, PSHB - это межсерверный протокол. Если вы находитесь за NAT, вы на самом деле не сервер. Несмотря на то, что мы выдвинули идеи о дополнительных расширениях PSHB для выполнения зависаний («длинный опрос») и / или опроса сообщений для таких клиентов, это не входит в базовую спецификацию. Основная спецификация - только сервер-сервер.

/ Брэд Фицпатрик, Сан-Франциско, Калифорния

Источник: http://moderator.appspot.com/#15/e=43e1a&t=426ac&f=b0c2d (прямая ссылка невозможна)

Я пришел к выводу, что самый простой способ - использовать HTTP-толчок Comet. Это простое и понятное решение, но его также можно использовать для веб-приложений.

Морган Кристиансон
источник
8

Существует новая программа с открытым исходным кодом для разработки библиотеки Java для push-уведомлений на Android с использованием комет-сервера Meteor в качестве бэкэнда. Вы можете проверить это в блоге проекта Deacon . Нам нужны разработчики, поэтому, пожалуйста, распространите информацию!

mtbkrdave
источник
7

Google недавно (18 мая 2016 года) объявил, что Firebase теперь является унифицированной платформой для мобильных разработчиков, включая push-уведомления практически в реальном времени. Это также мультиплатформенная платформа:

Теперь компания предлагает всем пользователям Firebase бесплатные и неограниченные уведомления с поддержкой iOS, Android и Интернета.

источник

Фрик Нортье
источник
6

Я не могу найти, где я читаю это, но я полагаю, что gmail использует открытое TCP-соединение для отправки по электронной почте.

Будет
источник
На joelapenna.com/blog/2009/07/android-foursquare-and-push есть запись в блоге от разработчика приложения для Android, которое, похоже, поддерживает это.
dalelane
Это мне кажется, они тоже голосуют. Мобильное устройство устанавливает соединение с сервером и уведомляет сервер, что оно ожидает обновлений. Фактический push-запрос инициируется сервером, что очень сложно для мобильных устройств, и большую часть времени включает поддержку сетевого провайдера (sms / wap push) ...
MrSnowflake
1
«C2DM позволяет сторонним разработчикам использовать ту же услугу, что и приложения Google». с Android Cloud на устройства обмена сообщениями
Colithium
6

Как GTalkвидно из SDK, было бы неплохо создать «стандартную» систему push-сообщений. Таким образом, должна работать только одна служба, только одно дополнительное TCP-соединение должно быть открыто. Приложения должны взаимодействовать с этой службой Intentsи сначала запрашивать разрешение на отправку и получение уведомлений от службы. Затем служба должна уведомить пользователя о том, что новое приложение хочет отправлять и получать сообщения. Затем пользователь предоставит или отклонит разрешение, поэтому он остается под контролем. Затем приложение зарегистрирует в сервисе категорию action +, чтобы служба знала, как доставить отправленное сообщение.

Будет хорошая идея или нет?

MrSnowflake
источник
6

Почему бы вам не пойти с реализацией XMPP. сейчас доступно так много общедоступных серверов, включая gtalk, jabber, citadel и т. д. Для Android также доступен один SDK с именем SMACK. Мы не можем сказать push-уведомление, но используя XMPP, вы можете оставить соединение между клиентом и сервером открытым, что позволит осуществлять двустороннюю связь. Значит, Android-клиент и сервер могут общаться друг с другом. В настоящее время это удовлетворит потребность Push в Android. Я реализовал пример кода, и он действительно отлично работает

Рахул Патель
источник
Хотите предоставить ссылку на ваш пример кода? Проведены ли какие-либо тесты относительно срока службы батареи?
Алекс
Я провел тестирование на время автономной работы - сердцебиение, которое нужно отправлять каждые шесть минут, сокращает срок службы батареи на 30% в худшем случае (т. Е. Устройство только просыпается, чтобы послать сердцебиение). В лучшем случае (пользователь использует устройство для просмотра, вызовов и т. Д.), Влияние на срок службы батареи незначительно.
плоть
6

Я недавно разработал http://pushdroid.org это единственное приложение, которое должно быть установлено на телефоне так же, как Google реализовал его в 2.2, работает с 1.5 и вещает через намерение.

Стефан
источник
4

Проблема с GCM заключается в том, что в процесс вовлечено много настроек:

  • Вы должны добавить много шаблонов в ваше приложение для Android
  • Вам необходимо настроить внешний сервер для связи с сервером GCM
  • Вам придется писать тесты

Если вам нравятся простые вещи (как я), вы должны попробовать UrbanAirship . Это (ИМХО) самый простой способ использовать GCM в вашем приложении без особых настроек. Это также дает вам симпатичный графический интерфейс для проверки правильности доставки ваших сообщений GCM.

  • Вы можете найти документы и руководство по началу работы здесь
  • Вы можете найти образец приложения здесь

Примечание: я никак не связан с UrbanAirship

fernandohur
источник
2

У них есть свои слушатели, которые вы должны использовать, используя их библиотечные классы в вашем коде. Вам не нужно беспокоиться о толкании. Вы должны отправить сообщение на сервер, сервер отправит сообщение на устройство. Они используют OAuth. Что касается протоколов, есть два метода, использующих CCS и XMPP. CCS просто использует XMPP в качестве аутентифицированного транспортного уровня, поэтому вы можете использовать большинство библиотек XMPP для управления соединением. Для отправки уведомлений на устройство вы можете написать код в приложение для Android, а также код вашего сервера. отправка сообщения будет осуществляться только вашим кодом. В случае GCM сервер Google позаботится об остальном. Вы можете проверить детали по этой ссылке

http://developer.android.com/google/gcm/server.html

Также по вопросам безопасности

безопасность обмена сообщениями в облаке Google https://groups.google.com/forum/#!topic/android-gcm/M-EevBitbhQ

Если ваше приложение не запущено, устройства также могут получать уведомления, потому что вы должны написать код для слушателей вещания. В фоновом режиме он будет прослушивать сервер и всякий раз, когда будет присутствовать какой-либо пакет сообщения, он будет получать сообщение как уведомление. У Android есть сервис, который вам нужен, чтобы не беспокоиться об этом. Вам нужно только использовать эти ресурсы, используя библиотечный класс, который облегчает вашу работу и позволяет им писать, если ваше приложение не запущено, а также оно получает уведомление. Очевидно, что будет какой-то слушатель, который сделает приложение для получения. Проверьте раздел «Получить сообщение» в этой ссылке

http://developer.android.com/google/gcm/client.html

Он также будет принимать запросы от пользователей. Для GCM это подойдет. Пожалуйста, отметьте «Отправить сообщение»

http://developer.android.com/google/gcm/client.html

оборота аджиткшарма
источник