Czy system Android obsługuje powiadomienia push w czasie rzeczywistym?

343

Niedawno dowiedziałem się o zdolności aplikacji iPhone do otrzymywania prawie natychmiastowych powiadomień o powiadomieniach aplikacji do aplikacji .

Jest to dostarczane w formie powiadomień push, specjalnie dostosowanego protokołu, który utrzymuje zawsze aktywne połączenie danych z iPhone'em i wysyła pakiety binarne do aplikacji, który wyskakuje z niewiarygodnie szybko, między 0,5 a 5 sekundami od wysłania aplikacji na serwer do aplikacji na telefon czas odpowiedzi. Jest on wysyłany jako dane - a nie SMS-y - w bardzo małych pakietach ładowanych w ramach abonamentu, a nie jako wiadomości przychodzące.

Chciałbym wiedzieć, czy przy użyciu Androida istnieje podobne narzędzie lub czy można zaimplementować coś podobnego za pomocą interfejsów API Androida. Aby to wyjaśnić, definiuję podobnie jak:

  • Nie wiadomość SMS, ale pewne rozwiązanie oparte na danych
  • Tak długo, jak to możliwe
  • Jest skalowalny, tzn. Jako serwerowa część aplikacji mobilnej, mógłbym powiadomić tysiące instancji aplikacji w kilka sekund

Rozumiem, że aplikacja może być oparta na ściąganiu, w stylu żądania / odpowiedzi HTTP, ale idealnie nie chcę zbytnio sondować, aby sprawdzić powiadomienia; poza tym to jest jak ściekający drenaż w planie danych.

j pimmel
źródło
3
Powiadomienia dla Gmaila i Gchata zwykle mieszczą się w tym progu. Powinien istnieć sposób na odtworzenie tego we własnej aplikacji.
Dana the Sane
Tak, jest androidem biblioteka sprawia, że pchania messaging bardzo prosta ... po prostu to Droid powiadomień Jigy za bibliotekę w aplikacji, a stamtąd to tylko około 10 linii kodu ... mam nadzieję, że to pomoże :)
Corey Harden
Sprawdź Pushy ( pushy.me ), aby uzyskać bramę powiadomień wypychanych w czasie rzeczywistym, która korzysta z MQTT pod maską w celu zwiększenia niezawodności. Pełne ujawnienie - założyłem Pushy.
Elad Nava

Odpowiedzi:

215

Firebase Cloud Messaging FCM FAQ to nowa wersja GCM. Dziedziczy podstawową infrastrukturę GCM, aby niezawodnie dostarczać wiadomości na Androida, iOS i Chrome. Będą jednak nadal obsługiwać GCM, ponieważ wielu programistów używa dzisiaj GCM SDK do obsługi powiadomień, a aktualizacja aplikacji klienckiej zajmuje dużo czasu.

Od 26 czerwca 2012 r. Google Cloud Messaging jest preferowanym sposobem wysyłania wiadomości do aplikacji działających na urządzeniach.

Wcześniej (i teraz przestarzała) usługa nosiła nazwę Cloud To Device Messaging .

j pimmel
źródło
14
Google udostępnia szczegółową dokumentację dotyczącą implementacji tego w aplikacji na Androida w Javie na code.google.com/android/c2dm, ale brakuje ich przykładowego kodu do komunikacji z aspektem C2DM po stronie serwera. Napisałem samouczek dla tego aspektu tutaj: blog.boxedice.com/2010/10/07/…
DavidM
2
Czy istnieje sposób oferowania powiadomień wypychanych użytkownikom z Androidem 2.2, ale włączenie tej samej aplikacji w starszych dystrybucjach, bez powiadomień wypychanych?
OneWorld,
3
@OneWorld: tak, jak każda inna technika kompatybilności wstecznej Androida, użyj refleksji, aby wybrać alternatywną strategię, gdy C2DM jest niedostępny, więcej: developer.android.com/resources/articles/…
Lie Ryan
1
developer.android.com/videos/index.html#v=PLM4LajwDVc Prezentacja Google I / O 2010 na temat powiadomień push
vokilam
6
C2DM został oficjalnie uznany za przestarzały od 26 czerwca 2012 r. Zamiast tego użyj [Google Cloud Messaging dla Androida] ( developer.android.com/guide/google/gcm/index.html zamiast tego
Mithun Sreedharan
47

XMPP to dobre rozwiązanie. Użyłem go do aplikacji na Androida z włączoną funkcją push. XMPP jest potężny, wysoce rozszerzalny i łatwy w integracji i obsłudze.

Istnieje mnóstwo darmowych serwerów XMPP (choć dzięki uprzejmości nie powinieneś ich nadużywać) i są serwery open source, które możesz uruchomić na jednym z twoich własnych urządzeń. OpenFire to doskonały wybór.

Biblioteka, której szukasz, nie jest Smack, jak wspomniano powyżej, to aSmack . Pamiętaj jednak, że jest to środowisko kompilacji - musisz zbudować bibliotekę.

To jest obliczenie, które wykonałem na wpływ XMPP na żywotność baterii:

Klient systemu Android musi utrzymywać stałe połączenie TCP, okresowo budząc się, aby wysłać puls na serwer XMPP.
To wyraźnie wiąże się z kosztami zużycia energii. Oszacowanie tego kosztu znajduje się poniżej:

  • Korzystanie z baterii 1400 mAh (dostarczonej w Nexus One i HTC Desire)
  • Bezczynne urządzenie podłączone do sieci 3G zużywa około 5 mA
  • Cykl budzenia, bicia serca i snu odbywa się co 5 minut, jego ukończenie zajmuje trzy sekundy i zużywa 300 mA
  • Koszt zużycia baterii na godzinę wynosi zatem:
    • 36 sekund 300 mA = 3 mAh wysyłanie bicia serca
    • 3600 sekund 5 mA = 5 mAh na biegu jałowym
    • 4:95 + 3 = 7: 95mAh łącznie
  • Bateria 1400 mAh wystarcza na około 11,6 dni na biegu jałowym i 7,3 dni na uruchomienie aplikacji, co stanowi około 37% zmniejszenie żywotności baterii.
  • Jednak skrócenie żywotności baterii o 37% stanowi absolutnie najgorszy przypadek w praktyce, biorąc pod uwagę, że urządzenia rzadko są całkowicie bezczynne.
ciało
źródło
2
Jednak w praktyce telefon będzie działał przez 3 godziny, gdy aplikacje to robią, ponieważ setki intencji działają, gdy telefon się budzi lub włącza się wyświetlacz lub zmiany stanu sieci.
Monstieur
33

Niedawno zacząłem grać w MQTT http://mqtt.org dla Androida jako sposób robienia tego, o co prosisz (tj. Nie SMS, ale dane, prawie natychmiastowe dostarczanie wiadomości, skalowalne, nie odpytywanie itp.)

Mam wpis na blogu z podstawowymi informacjami na ten temat, na wypadek gdyby był pomocny http://dalelane.co.uk/blog/?p=938

(Uwaga: MQTT jest technologią IBM i powinienem zauważyć, że pracuję dla IBM.)

dalelane
źródło
Jak to robi mqtt? Gdzieś musi być jakiś ankiet? Nawet jabłko musi sondować, ale myślę, że robią tylko jedno połączenie na raz, dlatego nie wyczerpują tak bardzo baterii ...
Janusz
3
Robi to poprzez otwarcie połączenia TCP / IP i pozostawienie go otwartego. Nie odpytuje, chociaż czasami musi wysłać niewielką wiadomość ping przez połączenie, aby utrzymać ją przy życiu.
dalelane
MQTT jest zdecydowanie najlepszym rozwiązaniem, jeśli wysyłanie wiadomości push przez Google powoduje, że czujesz się niekomfortowo. Ponadto mamy umowy o nieujawnianiu z naszymi klientami, które zabraniają korzystania z usług w chmurze do wymiany danych.
VH-NZZ
14

Wystarczy popatrzeć na Xtify platformy. Wygląda na to, że to robią,

Piotr
źródło
8

Jeśli możesz polegać na bibliotekach Google, które są dostępne dla Ciebie na rynku docelowym, możesz rzucić okiem na funkcjonalność GTalk (rejestrowanie zasobu na istniejącej nazwie użytkownika - przechwytywanie wiadomości przychodzących z odbiornikiem BroadcastReceiver).

Jeśli nie, i spodziewam się, że nie możesz , to jesteś w pakiecie własnych wersji XMPP . Jest to uciążliwe, ale może być łatwiejsze, jeśli XMPP jest pakowany osobno jako samodzielna biblioteka.

Możesz także rozważyć PubSubHubub , ale nie mam pojęcia, jak to wykorzystać w sieci. Wierzę, że jest zbudowany na szczycie XMPP.

jamesh
źródło
Myślę, że statystyki artykułu, że funkcja piggy back będzie zawsze dostępna, dopóki biblioteki GTalk będą w urządzeniu. Czy masz jakieś zasoby z przykładami, jak to zrobić?
Janusz
GTalk jest usuwany z zestawu SDK od wersji 1.0 (iirc).
MrSnowflake
8

Patrzyłem na to i PubSubHubBub polecany przez jamesh nie jest opcją. PubSubHubBub jest przeznaczony do komunikacji między serwerami

„Jestem za NAT. Czy mogę subskrybować Hub? Hub nie może się ze mną połączyć”.

/Anonimowy

Nie, PSHB jest protokołem serwer-serwer. Jeśli jesteś za NAT, tak naprawdę nie jesteś serwerem. Chociaż skopaliśmy pomysły na opcjonalne rozszerzenia PSHB do wykonywania zawieszania się („długie odpytywanie”) i / lub odpytywanie skrzynek wiadomości dla takich klientów, nie jest to podstawowa specyfikacja. Podstawowa specyfikacja dotyczy tylko serwer-serwer.

/ Brad Fitzpatrick, San Francisco, Kalifornia

Źródło: http://moderator.appspot.com/#15/e=43e1a&t=426ac&f=b0c2d (bezpośredni link nie jest możliwy)

Doszedłem do wniosku, że najprostszą metodą jest użycie wypychania HTTP komety. Jest to zarówno proste, jak i dobrze zrozumiałe rozwiązanie, ale można je również ponownie wykorzystać w aplikacjach internetowych.

Morgan Christiansson
źródło
8

Podjęto nowy wysiłek typu open-source, aby opracować bibliotekę Java do powiadomień wypychanych na Androida, używając serwera komet Meteor jako zaplecza. Możesz to sprawdzić na blogu projektu Deacon . Potrzebujemy programistów, więc proszę, powiedz nam!

mtbkrdave
źródło
7

Niedawno Google (18 maja 2016 r.) Ogłosił, że Firebase jest teraz ujednoliconą platformą dla programistów mobilnych, w tym powiadomieniami push w czasie zbliżonym do rzeczywistego. Jest to również platforma wieloplatformowa:

Firma oferuje teraz wszystkim użytkownikom Firebase bezpłatne i nieograniczone powiadomienia z obsługą iOS, Androida i Internetu.

źródło

Freek Nortier
źródło
6

Nie mogę znaleźć miejsca, w którym go czytam, ale uważam, że Gmail używa otwartego połączenia TCP do wysyłania wiadomości e-mail.

Będzie
źródło
Istnieje post na blogu pod adresem joelapenna.com/blog/2009/07/android-foursquare-and-push autorstwa autora aplikacji na Androida, który wydaje się to wspierać.
dalelane
Wydaje mi się, że oni również odpytują. Urządzenie mobilne nawiązuje połączenie z serwerem i powiadamia serwer, że oczekuje na aktualizacje. Rzeczywiste wypychanie jest inicjowane przez serwer, co jest bardzo trudne dla urządzeń mobilnych, i przez większość czasu wymaga wsparcia operatora sieci (sms / wap push) ...
MrSnowflake
1
„C2DM pozwala programistom zewnętrznym korzystać z tej samej usługi, co aplikacje Google”. z Android Cloud na urządzenie do
przesyłania
6

Tak jak GTalk już nie ma w pakiecie SDK, dobrym pomysłem może być utworzenie „standardowego” systemu przesyłania wiadomości push. W ten sposób musi być uruchomiona tylko jedna usługa, tylko jedno dodatkowe połączenie TCP musi być otwarte. Aplikacje powinny rozmawiać z tą usługą Intentsi powinny najpierw poprosić o pozwolenie na wysyłanie i otrzymywanie powiadomień z usługi. Usługa powinna następnie powiadomić użytkownika, że ​​nowa aplikacja chce wysyłać i odbierać wiadomości. Następnie użytkownik udzieli lub odmówi pozwolenia, więc zachowa kontrolę. Aplikacja zarejestruje następnie kategorię działania + w usłudze, dzięki czemu usługa będzie wiedziała, jak dostarczyć wiadomość wypychaną.

Czy to dobry pomysł, czy nie?

MrSnowflake
źródło
6

Dlaczego nie idziesz z implementacją XMPP. w tej chwili dostępnych jest tak wiele publicznych serwerów, w tym GTalk, Jabber, Cytadela itp. Dla Androida dostępny jest również jeden zestaw SDK o nazwie SMACK. Nie możemy powiedzieć powiadomienia wypychanego, ale używając XMPP możesz utrzymać otwarte połączenie między klientem a serwerem, co pozwoli na dwukierunkową komunikację. Oznacza, że ​​klient i serwer z Androidem mogą się ze sobą komunikować. Obecnie zaspokoi to potrzebę Push w Androidzie. Zaimplementowałem przykładowy kod i naprawdę działa świetnie

Rahul Patel
źródło
Chcesz podać link do przykładowego kodu? Czy wykonałeś jakieś testy dotyczące żywotności baterii?
Alex
Przeprowadziłem testy żywotności baterii - bicie serca, które musisz wysyłać co sześć minut, w najgorszym przypadku skraca żywotność baterii o 30% (tj. Urządzenie budzi się tylko po to, aby wysłać bicie serca). W najlepszym przypadku (użytkownik korzysta z urządzenia do przeglądania, połączeń itp.) Wpływ na żywotność baterii jest znikomy.
ciało
6

Niedawno opracowałem http://pushdroid.org jego pojedynczą aplikację, która powinna być zainstalowana na telefonie, podobnie jak Google zaimplementował ją w wersji 2.2. Działa od wersji 1.5 i jest nadawana celowo.

Stefan
źródło
4

Problem z GCM polega na tym, że proces ten wymaga dużej konfiguracji:

  • Musisz dodać wiele aplikacji do Androida
  • Musisz skonfigurować serwer zewnętrzny do komunikacji z serwerem GCM
  • Będziesz musiał pisać testy

Jeśli lubisz proste rzeczy (jak ja), powinieneś wypróbować UrbanAirship . Jest to (IMHO) najłatwiejszy sposób użycia GCM w aplikacji bez konieczności przeprowadzania dużej konfiguracji. Daje to również ładny GUI do testowania, czy Twoje wiadomości GCM są dostarczane poprawnie.

  • Dokumenty i przewodnik wprowadzający można znaleźć tutaj
  • Możesz znaleźć przykładową aplikację tutaj

Uwaga: w żaden sposób nie jestem powiązany z UrbanAirship

Fernandohur
źródło
2

Mają swoich detektorów, z których musisz korzystać, używając ich klas bibliotecznych w kodzie. Nie musisz się przejmować pchaniem. Musisz wysłać wiadomość do serwera, który wypchnie wiadomość do urządzenia. Używają OAuth. Jeśli chodzi o protokoły, istnieją dwie metody wykorzystujące CCS i XMPP. CCS po prostu używa XMPP jako uwierzytelnionej warstwy transportowej, więc możesz używać większości bibliotek XMPP do zarządzania połączeniem. Aby wysłać powiadomienia na urządzenie, możesz napisać kod w aplikacji na Androida, aby wysłać, a także kod serwera. wysłanie wiadomości zostanie wykonane tylko za pomocą Twojego kodu. Resztę zajmie Google Server w przypadku GCM. Możesz sprawdzić szczegóły pod tym linkiem

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

Również w kwestiach bezpieczeństwa

bezpieczeństwo przesyłania wiadomości w chmurze Google https://groups.google.com/forum/#!topic/android-gcm/M-EevBitbhQ

W przypadku, gdy aplikacja nie działa, urządzenia mogą otrzymywać powiadomienia, ponieważ musisz napisać kod dla słuchaczy transmisji. W tle będzie nasłuchiwał na serwerze i za każdym razem, gdy będzie tam jakiś pakiet wiadomości, odbierze wiadomość jako powiadomienie. Android ma usługę, której musisz się nie przejmować. Musisz korzystać tylko z tych zasobów za pomocą klasy biblioteki, która ułatwia pracę i pozwolić im pisać, jeśli twoja aplikacja nie działa, również otrzymuje powiadomienie. Oczywiście pewna aplikacja nasłuchująca sprawi, że aplikacja odbierze. Sprawdź sekcję „Odbierz wiadomość” w tym linku

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

Akceptuje również żądania użytkowników. W przypadku GCM wystarczy. Zaznacz „Wyślij wiadomość”

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

ajitksharma
źródło