Android prend-il en charge la notification push en temps quasi réel?

343

J'ai récemment appris sur la capacité des applications iPhone à recevoir des notifications presque instantanées aux applications des notifications aux applications .

Cela est fourni sous la forme de notifications push, un protocole sur mesure qui maintient une connexion de données toujours active avec l'iPhone et envoie des paquets binaires à l'application, qui affiche des alertes incroyablement rapidement, entre 0,5 et 5 secondes entre l'application serveur et l'envoi vers l'application téléphonique. Temps de réponse. Ceci est envoyé sous forme de données - plutôt que SMS - dans de très très petits paquets facturés dans le cadre du plan de données et non sous forme de messages entrants.

Je voudrais savoir si, en utilisant Android, il existe une installation similaire ou s'il est possible d'implémenter quelque chose de proche de cela en utilisant des API Android. Pour clarifier, je définis comme similaire:

  • Pas un SMS, mais une solution basée sur les données
  • Aussi en temps réel que possible
  • Est évolutif, c'est-à-dire que, en tant que partie serveur d'une application mobile, je pourrais notifier des milliers d'instances d'application en quelques secondes

J'apprécie que l'application puisse être basée sur le style de requête / réponse HTTP, mais dans l'idéal, je ne veux pas interroger autant pour vérifier les notifications; en plus de cela, c'est comme égoutter le plan de données.

j pimmel
la source
3
La notification pour gmail et gchat se situe généralement dans ce seuil. Il devrait y avoir un moyen de reproduire cela dans votre propre application.
Dana the Sane
Oui, il y a une bibliothèque Android qui rend la messagerie push très simple ... il suffit d'inclure la bibliothèque de notifications Droid de Jigy dans votre application et à partir de là, il ne reste plus que 10 lignes de code ... j'espère que cela aide :)
Corey Harden
Consultez Pushy ( pushy.me ) pour une passerelle de notification push en temps réel qui utilise MQTT sous le capot pour une fiabilité améliorée. Divulgation complète - J'ai fondé Pushy.
Elad Nava

Réponses:

215

La FAQ FCM de Firebase Cloud Messaging est la nouvelle version de GCM. Il hérite de l'infrastructure de base de GCM pour délivrer des messages de manière fiable sur Android, iOS et Chrome. Cependant, ils continueront à prendre en charge GCM car de nombreux développeurs utilisent aujourd'hui les SDK GCM pour gérer les notifications, et la mise à niveau de l'application cliente prend du temps.

Depuis le 26 juin 2012, Google Cloud Messaging est le moyen préféré d'envoyer des messages aux applications exécutées sur les appareils.

Auparavant (et maintenant obsolète), le service s'appelait Cloud To Device Messaging .

j pimmel
la source
14
Google fournit une documentation détaillée pour l'implémenter dans votre application Android en Java à code.google.com/android/c2dm mais leur exemple de code pour communiquer avec l'aspect côté serveur de C2DM est manquant. J'ai rédigé un tutoriel pour cet aspect ici: blog.boxedice.com/2010/10/07/…
DavidM
2
Existe-t-il un moyen d'offrir des notifications push aux utilisateurs d'Android 2.2, mais de rendre la même application exécutable sur les anciennes distributions, juste sans notifications push?
OneWorld
3
@OneWorld: oui, comme toute autre technique de rétrocompatibilité Android, utilisez la réflexion pour choisir une stratégie alternative lorsque le C2DM n'est pas disponible, pour plus d'informations: developer.android.com/resources/articles/…
Lie Ryan
1
developer.android.com/videos/index.html#v=PLM4LajwDVc Présentation Google I / O 2010 sur les notifications push
vokilam
6
C2DM est officiellement obsolète depuis le 26 juin 2012, utilisez plutôt [Google Cloud Messaging pour Android] ( developer.android.com/guide/google/gcm/index.html à la place
Mithun Sreedharan
47

XMPP est une bonne solution. Je l'ai utilisé pour une application Android en temps réel activée par push. XMPP est puissant, hautement extensible et facile à intégrer et à utiliser.

Il y a beaucoup de serveurs XMPP gratuits (bien que par courtoisie vous ne devriez pas en abuser) et il y a des serveurs open source que vous pouvez exécuter sur l'une de vos propres boîtes. OpenFire est un excellent choix.

La bibliothèque que vous voulez n'est pas Smack comme indiqué ci-dessus, c'est aSmack . Mais notez que c'est un environnement de construction - vous devrez construire la bibliothèque.

Voici un calcul que j'ai fait sur l'impact sur la vie de la batterie d'une solution XMPP:

Le client Android doit maintenir une connexion TCP persistante en se réveillant périodiquement pour envoyer une pulsation au serveur XMPP.
Cela impose clairement un coût en termes de consommation d'énergie. Une estimation de ce coût est fournie ci-dessous:

  • Utilisation d'une batterie 1400mAh (telle que fournie dans le Nexus One et le HTC Desire)
  • Un appareil inactif, connecté à un réseau 3G, utilise environ 5mA
  • Le cycle de réveil, de battement de cœur et de sommeil se produit toutes les 5 minutes, prend trois secondes et utilise 300mA
  • Le coût d'utilisation de la batterie par heure est donc:
    • 36 secondes 300mA = 3mAh envoi du rythme cardiaque
    • 3600 secondes 5mA = 5mAh au ralenti
    • 4:95 + 3 = 7: 95mAh combinés
  • Une batterie de 1400 mAh dure environ 11,6 jours au repos et 7,3 jours lors de l'exécution de l'application, ce qui représente une réduction d'environ 37% de la durée de vie de la batterie.
  • Cependant, une réduction de la durée de vie de la batterie de 37% représente le pire cas absolu dans la pratique étant donné que les appareils sont rarement complètement inactifs.
la chair
la source
2
Cependant, dans la pratique, le téléphone durera 3 heures lorsque les applications le font, car des centaines d'intentions s'exécutent lorsque le téléphone se réveille ou affiche des commutations ou des changements d'état du réseau.
Monstieur
33

J'ai récemment commencé à jouer avec MQTT http://mqtt.org pour Android comme un moyen de faire ce que vous demandez (c'est-à-dire non pas SMS mais piloté par les données, livraison de messages presque immédiate, évolutive, pas de sondage, etc.)

J'ai un article de blog avec des informations générales à ce sujet au cas où cela serait utile http://dalelane.co.uk/blog/?p=938

(Remarque: MQTT est une technologie IBM, et je dois souligner que je travaille pour IBM.)

dalelane
la source
Comment mqtt fait-il cela? Il doit y avoir un sondage quelque part? Même Apple doit sonder mais je pense qu'ils ne font qu'une seule connexion à la fois donc ne décharge pas beaucoup la batterie ...
Janusz
3
Il le fait en ouvrant une connexion TCP / IP et en la laissant ouverte. Il n'interroge pas, bien qu'il doive occasionnellement envoyer un petit message ping sur la connexion pour le maintenir en vie.
dalelane
MQTT est certainement la voie à suivre si l'envoi de votre message push via Google vous met mal à l'aise. De plus, nous avons des accords de non-divulgation avec nos clients qui interdisent l'utilisation des services cloud pour les échanges de données.
VH-NZZ
14

Jetez un œil à la plateforme Xtify . On dirait que c'est ce qu'ils font,

peter
la source
8

Si vous pouvez compter sur les bibliothèques Google pour votre marché cible, vous pouvez alors utiliser la fonctionnalité GTalk (enregistrer une ressource sur le nom d'utilisateur existant - l'intercepter les messages lorsqu'ils arrivent avec un BroadcastReceiver).

Si ce n'est pas le cas, et je suppose que vous ne pouvez pas , alors vous êtes en train de regrouper vos propres versions de XMPP . C'est un problème, mais cela peut être facilité si XMPP est fourni séparément en tant que bibliothèque autonome.

Vous pouvez également envisager PubSubHubub , mais je n'ai aucune idée de l'utilisation du réseau. Je crois qu'il est construit au sommet de XMPP.

jamesh
la source
Je pense que les statistiques de l'article selon lesquelles la fonctionnalité de ferroutage seront toujours disponibles tant que les bibliothèques gtalk sont sur l'appareil. Avez-vous des ressources avec des exemples sur la façon de le faire?
Janusz
GTalk est supprimé du SDK depuis 1.0 (iirc).
MrSnowflake
8

J'ai étudié cela et PubSubHubBub recommandé par jamesh n'est pas une option. PubSubHubBub est destiné aux communications de serveur à serveur

"Je suis derrière un NAT. Puis-je m'abonner à un hub? Le hub ne peut pas se connecter à moi."

/Anonyme

Non, PSHB est un protocole de serveur à serveur. Si vous êtes derrière NAT, vous n'êtes pas vraiment un serveur. Bien que nous ayons lancé des idées d'extensions PSHB facultatives pour effectuer des accrochages ("interrogation longue") et / ou une interrogation de boîte de message pour ces clients, ce n'est pas dans la spécification principale. La spécification principale est uniquement de serveur à serveur.

/ Brad Fitzpatrick, San Francisco, Californie

Source: http://moderator.appspot.com/#15/e=43e1a&t=426ac&f=b0c2d (lien direct impossible)

J'en suis venu à la conclusion que la méthode la plus simple consiste à utiliser Comet HTTP push. Il s'agit à la fois d'une solution simple et bien comprise, mais elle peut également être réutilisée pour des applications Web.

Morgan Christiansson
la source
8

Il y a un nouvel effort open source pour développer une bibliothèque Java pour les notifications push sur Android, en utilisant le serveur comète Meteor comme backend. Vous pouvez le vérifier sur le blog du projet Deacon . Nous avons besoin de développeurs, alors faites passer le mot!

mtbkrdave
la source
7

Google a récemment (18 mai 2016) annoncé que Firebase est désormais sa plate-forme unifiée pour les développeurs mobiles, y compris les notifications push en temps quasi réel.Il est également multi-plateforme:

La société propose désormais à tous les utilisateurs de Firebase des notifications gratuites et illimitées avec prise en charge d'iOS, d'Android et du Web.

la source

Freek Nortier
la source
6

Je ne trouve pas où je l'ai lu, mais je pense que gmail utilise une connexion TCP ouverte pour envoyer les e-mails.

Volonté
la source
Il y a un article de blog sur joelapenna.com/blog/2009/07/android-foursquare-and-push par un développeur d'une application Android qui semble soutenir cela.
dalelane
Ceux-ci me semblent, ils sondent aussi. L'appareil mobile établit une connexion avec le serveur et informe le serveur qu'il attend des mises à jour. Le push réel est initié par le serveur, ce qui est très difficile pour les appareils mobiles, et implique la plupart du temps le support du fournisseur de réseau (sms / wap push) ...
MrSnowflake
1
"C2DM permet aux développeurs tiers d'utiliser le même service que les applications Google." de Android Cloud To Device Messaging
colithium
6

Comme GTalk pour le SDK, il peut être judicieux de créer un système de messagerie push «standard». De cette façon, un seul service doit s'exécuter, une seule connexion TCP supplémentaire doit être ouverte. Les applications doivent parler à ce service en utilisant Intentset doivent d'abord demander l'autorisation d'envoyer et de recevoir une notification du service. Le service doit alors informer l'utilisateur qu'une nouvelle application souhaite envoyer et recevoir des messages. L'utilisateur accordera ou refusera ensuite l'autorisation, afin de garder le contrôle. L'application enregistrera ensuite une catégorie action + au service, afin que le service sache comment délivrer le message poussé.

Serait-ce une bonne idée ou non?

MrSnowflake
la source
6

Pourquoi ne pas aller avec l'implémentation XMPP. en ce moment, il y a tellement de serveurs publics disponibles, y compris gtalk, jabber, citadel etc. Pour Android, il existe un SDK nommé SMACK. Cela, nous ne pouvons pas dire une notification push, mais en utilisant le XMPP, vous pouvez garder une connexion ouverte entre le client et le serveur qui permettra une communication bidirectionnelle. Signifie que le client et le serveur Android peuvent tous deux communiquer entre eux. À l'heure actuelle, cela répondra aux besoins de Push dans Android. J'ai implémenté un exemple de code et cela fonctionne vraiment bien

Rahul Patel
la source
Vous souhaitez fournir un lien vers votre exemple de code? Avez-vous testé la durée de vie de la batterie?
Alex
J'ai fait des tests sur la durée de vie de la batterie - le rythme cardiaque que vous devez envoyer toutes les six minutes réduit la durée de vie de la batterie de 30% dans le pire des cas (c'est-à-dire que l'appareil se réveille uniquement pour envoyer un rythme cardiaque). Dans le meilleur des cas (l'utilisateur utilise l'appareil pour la navigation, les appels, etc.), l'impact sur la durée de vie de la batterie est négligeable.
chair
6

J'ai récemment développé http://pushdroid.org une application unique qui devrait être installée sur le téléphone, tout comme google l'a implémentée en 2.2, cela fonctionne à partir de 1.5 et diffuse via l'intention.

Stefan
la source
4

Le problème avec GCM est qu'il y a beaucoup de configuration impliquée dans le processus:

  • Vous devez ajouter beaucoup de passe-partout à votre application Android
  • Vous devez configurer un serveur externe pour communiquer avec le serveur GCM
  • Vous devrez passer des tests

Si vous aimez les choses simples (comme moi), vous devriez essayer UrbanAirship . C'est (à mon humble avis) la façon la plus simple d'utiliser GCM dans votre application sans faire beaucoup de configuration. Il vous donne également une jolie interface graphique pour tester que vos messages GCM sont livrés correctement.

  • Vous pouvez trouver les documents et le guide de démarrage ici
  • Vous pouvez trouver un exemple d'application ici

Remarque: je ne suis d'aucune façon affilié à UrbanAirship

fernandohur
la source
2

Ils ont leurs écouteurs que vous devez utiliser en utilisant leurs classes de bibliothèque dans votre code. Vous ne devez pas vous soucier de pousser. Vous devez envoyer le message au serveur serveur poussera le message vers l'appareil. Ils utilisent OAuth. Concernant les protocoles, il existe deux méthodes utilisant CCS et XMPP. CCS utilise simplement XMPP comme couche de transport authentifiée, vous pouvez donc utiliser la plupart des bibliothèques XMPP pour gérer la connexion. Pour envoyer des notifications à l'appareil, vous pouvez écrire du code dans l'application Android à envoyer ainsi que le code de votre serveur. l'envoi du message se fera uniquement par votre code. Le reste sera pris en charge par Google Server dans le cas GCM. Vous pouvez vérifier les détails sur ce lien

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

Aussi, pour des problèmes de sécurité

sécurité de la messagerie google cloud https://groups.google.com/forum/#!topic/android-gcm/M-EevBitbhQ

Si votre application ne fonctionne pas, les appareils peuvent également recevoir une notification, car vous devez écrire du code pour les auditeurs de diffusion. En arrière-plan, il écoutera le serveur et chaque fois qu'un paquet de messages sera là, il recevra le message comme notification. Android a le service dont vous avez besoin pour ne pas vous en soucier. Vous n'avez qu'à utiliser ces ressources en utilisant la classe de bibliothèque qui facilite votre travail et à les laisser écrire si votre application n'est pas en cours d'exécution, elle reçoit également une notification. De toute évidence, il y aurait un auditeur qui ferait l'appli pour recevoir.Vérifiez la section "Recevoir le message" dans ce lien

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

Il acceptera également les demandes des utilisateurs. Pour GCM, cela suffira. Veuillez cocher "Envoyer un message"

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

ajitksharma
la source