Notifications Push dans la plate-forme Android

Je cherche à écrire une application qui reçoit des alertes poussées d’un serveur. J’ai trouvé quelques méthodes pour le faire.

  1. SMS – Intercepter les SMS entrants et lancer un appel depuis le serveur
  2. Interroger le serveur périodiquement

Chacun a ses propres limites. SMS- pas de garantie sur l’heure d’arrivée Le sondage peut vider la batterie.

Avez-vous une meilleure suggestion s’il vous plaît? Merci beaucoup.

La réponse officielle de Google est le Cloud to Device Messaging Framework d’Android (obsolète) Google Cloud Messaging (obsolète) Firebase Cloud Messaging

Cela fonctionnera sur Android> = 2.2 (sur les téléphones qui ont le Play Store).

( cross-posting à partir d’une réponse que j’ai donnée à une question similaire – Android prend-il en charge la notification push en temps quasi-réel? )

J’ai récemment commencé à jouer avec MQTT http://mqtt.org pour Android pour faire ce genre de choses (c.-à-d. Notification push qui n’est pas un SMS mais une transmission de données, presque immédiate, pas d’interrogation, etc.)

J’ai un article de blog avec des informations de base sur ce sujet au cas où cela serait utile

http://dalelane.co.uk/blog/?p=938

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

Android Cloud to Device Messaging Framework

Important: C2DM est officiellement obsolète depuis le 26 juin 2012. Cela signifie que C2DM a cessé d’accepter de nouveaux utilisateurs et demandes de quotas. Aucune nouvelle fonctionnalité ne sera ajoutée à C2DM. Cependant, les applications utilisant C2DM continueront à fonctionner. Les développeurs C2DM existants sont encouragés à migrer vers la nouvelle version de C2DM, appelée Google Cloud Messaging pour Android (GCM). Consultez le document de migration de C2DM vers GCM pour plus d’informations. Les développeurs doivent utiliser GCM pour les nouveaux développements.

Veuillez vérifier le lien suivant:

http://developer.android.com/guide/google/gcm/index.html

Ici, j’ai écrit quelques étapes pour obtenir un ID et des notifications à partir de zéro

  1. Créer / Enregistrer une application sur Google Cloud
  2. Configuration du Cloud SDK avec développement
  3. Configurer le projet pour GCM
  4. Obtenir l’identifiant d’enregistrement du périphérique
  5. Envoyer des notifications push
  6. Recevoir des notifications push

Vous pouvez trouver un tutoriel complet dans le lien URL ci-dessous

Prise en main de la notification push Android: le dernier didacticiel Google Cloud Messaging (GCM) – étape par étape

entrer la description de l'image ici

Code snip pour obtenir l’ID d’enregistrement (jeton de périphérique pour la notification Push).

Configurer le projet pour GCM


Mettre à jour le fichier AndroidManifest

Pour activer GCM dans notre projet, nous devons append quelques permissions dans notre fichier manifeste Accédez à AndroidManifest.xml et ajoutez le code ci-dessous Ajouter une autorisation

    .permission.C2D_MESSAGE" /> .permission.C2D_MESSAGE" android:protectionLevel="signature" /> 

Ajouter une déclaration de récepteur de diffusion GCM

Ajouter la déclaration GCM Broadcast Receiver dans votre balise d’application

        

Ajouter la déclaration GCM Servie

   

Obtenir l’ID d’enregistrement (jeton de périphérique pour la notification Push)

Maintenant, allez à votre activité de lancement / splash

Ajouter des constantes et des variables de classe

 private final static int PLAY_SERVICES_RESOLUTION_REQUEST = 9000; public static final Ssortingng EXTRA_MESSAGE = "message"; public static final Ssortingng PROPERTY_REG_ID = "registration_id"; private static final Ssortingng PROPERTY_APP_VERSION = "appVersion"; private final static Ssortingng TAG = "LaunchActivity"; protected Ssortingng SENDER_ID = "Your_sender_id"; private GoogleCloudMessaging gcm =null; private Ssortingng regid = null; private Context context= null; 

Mettre à jour les méthodes OnCreate et OnResume

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_launch); context = getApplicationContext(); if (checkPlayServices()) { gcm = GoogleCloudMessaging.getInstance(this); regid = getRegistrationId(context); if (regid.isEmpty()) { registerInBackground(); } else { Log.d(TAG, "No valid Google Play Services APK found."); } } } @Override protected void onResume() { super.onResume(); checkPlayServices(); } # Implement GCM Required methods (Add below methods in LaunchActivity) private boolean checkPlayServices() { int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this); if (resultCode != ConnectionResult.SUCCESS) { if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) { GooglePlayServicesUtil.getErrorDialog(resultCode, this, PLAY_SERVICES_RESOLUTION_REQUEST).show(); } else { Log.d(TAG, "This device is not supported - Google Play Services."); finish(); } return false; } return true; } private Ssortingng getRegistrationId(Context context) { final SharedPreferences prefs = getGCMPreferences(context); Ssortingng registrationId = prefs.getSsortingng(PROPERTY_REG_ID, ""); if (registrationId.isEmpty()) { Log.d(TAG, "Registration ID not found."); return ""; } int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE); int currentVersion = getAppVersion(context); if (registeredVersion != currentVersion) { Log.d(TAG, "App version changed."); return ""; } return registrationId; } private SharedPreferences getGCMPreferences(Context context) { return getSharedPreferences(LaunchActivity.class.getSimpleName(), Context.MODE_PRIVATE); } private static int getAppVersion(Context context) { try { PackageInfo packageInfo = context.getPackageManager() .getPackageInfo(context.getPackageName(), 0); return packageInfo.versionCode; } catch (NameNotFoundException e) { throw new RuntimeException("Could not get package name: " + e); } } private void registerInBackground() { new AsyncTask() { Override protected Object doInBackground(Object... params) { Ssortingng msg = ""; try { if (gcm == null) { gcm = GoogleCloudMessaging.getInstance(context); } regid = gcm.register(SENDER_ID); Log.d(TAG, "########################################"); Log.d(TAG, "Current Device's Registration ID is: "+msg); } catch (IOException ex) { msg = "Error :" + ex.getMessage(); } return null; } protected void onPostExecute(Object result) { //to do here }; }.execute(null, null, null); } 

Note : stockez s’il vous plaît REGISTRATION_KEY, il est important pour envoyer le message de PNG à GCM gardez également dans ceci ce sera unique pour tout le dispositif, en utilisant ceci seulement GCM enverra la notification de poussée.

Recevoir des notifications push

Ajouter une classe de récepteur de diffusion GCM

Comme nous avons déjà déclaré «GcmBroadcastReceiver.java» dans notre fichier Manifest, alors permet de créer ce code de classe de récepteur de mise à jour de classe de cette façon

 public class GcmBroadcastReceiver extends WakefulBroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { ComponentName comp = new ComponentName(context.getPackageName(), GcmIntentService.class.getName()); startWakefulService(context, (intent.setComponent(comp))); setResultCode(Activity.RESULT_OK); Toast.makeText(context, “wow!! received new push notification", Toast.LENGTH_LONG).show(); } } 

Ajouter une classe de service GCM

Comme nous avons déjà déclaré «GcmBroadcastReceiver.java» dans notre fichier Manifest, alors permet de créer ce code de classe de récepteur de mise à jour de classe de cette façon

 public class GcmIntentService extends IntentService { public static final int NOTIFICATION_ID = 1; private NotificationManager mNotificationManager; private final static Ssortingng TAG = "GcmIntentService"; public GcmIntentService() { super("GcmIntentService"); } @Override protected void onHandleIntent(Intent intent) { Bundle extras = intent.getExtras(); Log.d(TAG, "Notification Data Json :" + extras.getSsortingng("message")); GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this); Ssortingng messageType = gcm.getMessageType(intent); if (!extras.isEmpty()) { if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR .equals(messageType)) { sendNotification("Send error: " + extras.toSsortingng()); } else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED .equals(messageType)) { sendNotification("Deleted messages on server: " + extras.toSsortingng()); // If it's a regular GCM message, do some work. } else if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE .equals(messageType)) { // This loop represents the service doing some work. for (int i = 0; i < 5; i++) { Log.d(TAG," Working... " + (i + 1) + "/5 @ " + SystemClock.elapsedRealtime()); try { Thread.sleep(5000); } catch (InterruptedException e) { } } Log.i(TAG, "Completed work @ " + SystemClock.elapsedRealtime()); sendNotification(extras.getString("message")); } } // Release the wake lock provided by the WakefulBroadcastReceiver. GcmBroadcastReceiver.completeWakefulIntent(intent); } // Put the message into a notification and post it. // This is just one simple example of what you might choose to do with // a GCM message. private void sendNotification(String msg) { mNotificationManager = (NotificationManager) this .getSystemService(Context.NOTIFICATION_SERVICE); PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, LaunchActivity.class), 0); NotificationCompat.Builder mBuilder = new NotificationCompat.Builder( this) .setSmallIcon(R.drawable.icon) .setContentTitle("Ocutag Snap") .setStyle(new NotificationCompat.BigTextStyle().bigText(msg)) .setContentText(msg) .setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE); mBuilder.setContentIntent(contentIntent); mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build()); } } 

Ma compréhension / expérience de la notification push Android est la suivante:

  1. C2DM GCM – Si votre plateforme Android cible est 2.2+, alors allez-y. Juste une prise, les utilisateurs de l’appareil doivent toujours être connectés à un compte Google pour obtenir les messages.

  2. MQTT – Approche basée sur Pub / Sub, nécessite une connexion active à partir de l’appareil, peut drainer la batterie si elle n’est pas correctement mise en œuvre.

  3. Deacon – Peut ne pas être bon à long terme en raison du soutien limité de la communauté.

Edit : Ajouté le 25 novembre 2013

GCM – Google dit …

Pour les périphériques antérieurs à la version 3.0, les utilisateurs doivent configurer leur compte Google sur leurs appareils mobiles. Un compte Google n’est pas obligatoire sur les appareils fonctionnant sous Android 4.0.4 ou supérieur. *

Il existe un nouvel effort open-source pour développer une bibliothèque Java pour les notifications push sur Android basée sur le serveur Web Meteor. Vous pouvez le consulter sur le blog du projet Deacon , où vous trouverez des liens vers Meteor et le référentiel GitHub du projet. Nous avons besoin de développeurs, alors passez le mot!

Vous pouvez utiliser Xtify ( http://developer.xtify.com ) – ils ont un service Web de notifications push qui fonctionne avec leur SDK. c’est gratuit et jusqu’à présent, ça a très bien fonctionné pour moi.

ou….

3) Conservez une connexion avec le serveur, envoyez des messages de maintien toutes les quelques minutes et le serveur peut envoyer des messages instantanément. C’est ainsi que fonctionnent Gmail, Google Talk, etc.

Je recommande d’utiliser GCM – Google Cloud Messaging pour Android C’est gratuit, et pour des utilisations simples, il devrait être très facile.

Cependant, il faut maintenir un serveur tiers pour envoyer les notifications en votre nom. Si vous voulez éviter cela, il existe de très bonnes solutions indussortingelles pour le service de notifications push Android:

  • Urban Airship – gratuit jusqu’à 1M de notifications par mois, après quoi vous êtes facturé pour 1000 notifications
  • PushApps – gratuit pour des notifications de 1M par mois et des notifications illimitées pour 19.99 par mois
  • PushWoosh – gratuit pour les appareils 1M, les plans premium sont à partir de 39 euros

Diclaimer – Je travaille dans PushApps et utilise également leur produit dans mes applications depuis plus d’un an.

Au 18/05/2016, Firebase est la plate-forme unifiée de Google pour les développeurs mobiles, y compris les notifications push.

Je crains que vous ayez trouvé les deux méthodes possibles. Au début, Google allait au moins implémenter une API GChat que vous pourriez utiliser pour une implémentation push / pull. Malheureusement, cette bibliothèque a été coupée par Android 1.0.

Je ne sais pas si c’est toujours utile. J’ai réalisé quelque chose comme ça avec une bibliothèque java sur http://www.pushlets.com/

Tout en le faisant dans un service n’empêchera pas Android de le fermer et de tuer le fil de l’auditeur.

Google C2DM est maintenant amorti, pour cela, vous devez utiliser le nouveau service GCM (Google Cloud Messaging). Pour la documentation, voir http://developer.android.com/guide/google/gcm/gs.html

C2DM: vos utilisateurs doivent avoir le compte gmail.

MQTT: lorsque votre connexion atteindra 1024, elle cessera de fonctionner à cause de l’utilisation de “select model” de Linux.

Il y a un service push gratuit et api pour Android, vous pouvez l’essayer: http://push-notification.org

Méthode gratuite et facile:

Si votre base d’utilisateurs cible n’est pas grande (moins de 1 000) et que vous souhaitez démarrer un service gratuit, Airbop est le meilleur et le plus pratique.

Site Web Airbop Il utilise le service Google Cloud Messaging via son API et offre de bonnes performances. Je l’ai utilisé pour deux de mes projets et c’était facile à mettre en œuvre.

Les services tels que Urbanship et Urbanship sont excellents mais fournissent une stack de déploiement complète et pas seulement les notifications push.

Si vous ne ciblez que le service push, Airbop fonctionnera correctement.

Je n’ai pas utilisé Pushwoosh , mais c’est aussi un excellent choix. Il permet de pousser jusqu’à 1 000 000 de périphériques gratuitement

Je suggère d’utiliser à la fois SMS et HTTP. Si l’utilisateur n’est pas connecté, envoyez un SMS à son téléphone pour lui notifier qu’un message est en attente.

Voilà comment fonctionne ce service Ericsson Labs: https://labs.ericsson.com/apis/mobile-java-push/

Si vous l’implémentez vous-même, la partie délicate consiste à supprimer le SMS entrant sans que l’utilisateur ne le voie. Ou peut-être que ça va s’ils le voient dans votre cas.

On dirait que cela fonctionne: Suppression de SMS en utilisant BroadCastReceiver – Android

Oui, écrire un code comme celui-ci peut être dangereux et vous risquez de ruiner la vie de quelqu’un car votre application a supprimé un SMS qui ne devrait pas l’être.

Vous pouvez utiliser Google Cloud Messaging ou GCM , c’est gratuit et facile à utiliser. Vous pouvez également utiliser des serveurs push tiers tels que PushWoosh, ce qui vous donne plus de flexibilité

Il y a beaucoup de serveurs tiers comme Urban Airship , Xtify, Mainline , … qui permettent d’envoyer non seulement sur Android, mais aussi sur les iOs, Windows Phone …

Vous pouvez utiliser Pusher

C’est un service hébergé qui simplifie l’ajout de données et de fonctionnalités en temps réel aux applications Web et mobiles.
Pusher propose des bibliothèques à intégrer dans tous les runtimes et frameworks principaux.

PHP, Ruby, Python, Java, .NET, Go and Node sur le serveur
JavaScript, Objective-C (iOS) and Java (Android) sur le client.