web-dev-qa-db-fra.com

Notifications Push dans la plateforme 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 - Intercepte le SMS entrant et lance un transfert depuis le serveur
  2. Interroger le serveur périodiquement

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

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

263
Vinod

La réponse officielle de Google est la Framework de messagerie Android Cloud to Device (obsolète)Google Cloud Messaging (obsolète) Messagerie Cloud Firebase

Cela fonctionnera sur Android> = 2.2 (sur les téléphones équipés du Play Store).

202
BoD

( publication croisée d'une réponse que j'ai donnée à une question similaire - _ Est-ce que Android prend en charge la notification Push en temps quasi réel?)

J'ai récemment commencé à jouer avec MQTT http://mqtt.org pour Android comme moyen de faire ce genre de chose (c'est-à-dire une notification Push qui n'est pas SMS mais axé sur les données, remise quasi immédiate des messages, non interrogation, 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 préciser que je travaille pour IBM.)

29
dalelane

Ma compréhension/expérience avec Android Notification push est la suivante:

  1. C2DM GCM - Si votre plate-forme cible Android est une version 2.2+, alors allez-y. Juste une capture, les utilisateurs d'appareils doivent toujours être connectés à un compte Google pour recevoir les messages.

  2. MQTT - Approche basée sur la publication/sous-traitance, nécessite une connexion active de l'appareil, peut épuiser 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é.

Modifier : Ajouté le 25 novembre 2013

GCM - Google dit ...

Pour les appareils 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 exécutant Android 4.0.4 ou une version ultérieure. *

17
Lalit

Ici, j'ai écrit quelques étapes pour Comment obtenir un RegID et une notification en partant de zéro

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

Vous pouvez trouver le tutoriel complet ci-dessous lien URL

Mise en route avec Android Notification Push: Dernier message Google Cloud Messaging (GCM) - tutoriel complet étape par étape =

enter image description here

Code snip pour obtenir l'ID d'enregistrement (jeton de périphérique pour notification push).

Configurer le projet pour GCM


Mettre à jour le fichier AndroidManifest

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

<uses-permission Android:name="Android.permission.INTERNET”/>
<uses-permission Android:name="Android.permission.GET_ACCOUNTS" />
<uses-permission Android:name="Android.permission.WAKE_LOCK" />

<uses-permission Android:name="Android.permission.VIBRATE" />

<uses-permission Android:name=“.permission.RECEIVE" />
<uses-permission Android:name=“<your_package_name_here>.permission.C2D_MESSAGE" />
<permission Android:name=“<your_package_name_here>.permission.C2D_MESSAGE"
        Android:protectionLevel="signature" />

Ajouter une déclaration GCM Broadcast Receiver

ajoutez la déclaration du récepteur de diffusion GCM dans votre balise d'application

<application
        <receiver
            Android:name=".GcmBroadcastReceiver"
            Android:permission="com.google.Android.c2dm.permission.SEND" ]]>
            <intent-filter]]>
                <action Android:name="com.google.Android.c2dm.intent.RECEIVE" />
                <category Android:name="" />
            </intent-filter]]>

        </receiver]]>

<application/>

Ajouter une déclaration GCM Servie

<application
     <service Android:name=".GcmIntentService" />
<application/>

Obtenir un ID d'enregistrement (jeton de périphérique pour la notification push)

Allez maintenant à votre activité Launch/Splash

Ajouter des constantes et des variables de classe

private final static int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;
public static final String EXTRA_MESSAGE = "message";
public static final String PROPERTY_REG_ID = "registration_id";
private static final String PROPERTY_APP_VERSION = "appVersion";
private final static String TAG = "LaunchActivity";
protected String SENDER_ID = "Your_sender_id";
private GoogleCloudMessaging gcm =null;
private String 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 String getRegistrationId(Context context) 
{
   final SharedPreferences prefs = getGCMPreferences(context);
   String registrationId = prefs.getString(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) 
     {
          String 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);
}

Remarque : veuillez enregistrer REGISTRATION_KEY, il est important d'envoyer un message PN à GCM, mais conservez-le. Ce message sera unique pour tous les appareils, en utilisant ce seul GCM. enverra une notification push.

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 manifeste, créons de cette manière le code de classe du récepteur de mise à jour de classe.

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 manifeste, créons de cette manière le code de classe du récepteur de mise à jour de classe.

public class GcmIntentService extends IntentService
{     public static final int NOTIFICATION_ID = 1;     private NotificationManager mNotificationManager;     private final static String TAG = "GcmIntentService";     public GcmIntentService() {
     super("GcmIntentService");     
     }     @Override
     protected void onHandleIntent(Intent intent) {
          Bundle extras = intent.getExtras();
          Log.d(TAG, "Notification Data Json :" + extras.getString("message"));

          GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);
          String messageType = gcm.getMessageType(intent);          if (!extras.isEmpty()) {          if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR
               .equals(messageType)) {
               sendNotification("Send error: " + extras.toString());
          } else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED
          .equals(messageType)) {
          sendNotification("Deleted messages on server: "
          + extras.toString());          // 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());
     }
}
17
swiftBoy

Cadre de messagerie Android Cloud to Device

Important: C2DM est officiellement obsolète depuis le 26 juin 2012. Cela signifie que C2DM a cessé d'accepter de nouveaux utilisateurs et de nouvelles demandes de quota. Aucune nouvelle fonctionnalité ne sera ajoutée à C2DM. Cependant, les applications utilisant C2DM continueront à fonctionner. Les développeurs C2DM existants sont invités à migrer vers la nouvelle version de C2DM, appelée Google Cloud Messaging pour Android (GCM). Consultez le document Migration 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

17
chiranjib

Un nouvel effort open-source consiste à développer une bibliothèque Java pour les notifications Push sur Android sur la base du serveur Web Meteor. Vous pouvez le vérifier sur le site 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 s'il vous plaît, passez le mot!

11
mtbkrdave

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 vraiment bien fonctionné pour moi.

9
peter

ou....

) Conservez une connexion au serveur, envoyez des alertes persistantes toutes les quelques minutes et le serveur peut envoyer des messages instantanément. Voici comment fonctionnent Gmail, Google Talk, etc.

8
Isaac Waller

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

6
Freek Nortier

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

Cependant, il est nécessaire de maintenir un serveur tiers pour envoyer les notifications en votre nom. Si vous voulez éviter les très bonnes solutions industrielles pour Android service de notifications push:

  • rban Airship - jusqu'à 1 million de notifications gratuites par mois, vous êtes ensuite facturé pour 1000 notifications
  • PushApps - gratuit pour les notifications 1M par mois, et les notifications illimitées pour 19.99 par mois
  • PushWoosh - gratuit pour les appareils 1M, les plans premium sont à partir de 39 EURO

Diclaimer - Je travaille dans des PushApps et j'utilise également leur produit dans mes applications depuis plus d'un an maintenant.

6
Orr

J'ai bien peur que vous ayez trouvé les deux méthodes possibles. Au moins au début, Google allait implémenter une API GChat que vous pouvez utiliser pour une implémentation Push/Pull. Malheureusement, cette bibliothèque a été coupée par Android 1.0.

4
haseman

Je ne sais pas si cela est toujours utile. J'ai réalisé quelque chose comme ceci avec une bibliothèque Java à l'adresse http://www.pushlets.com/

Bien que le faire dans un service n'empêche pas Android de l'arrêter et de tuer le thread d'écoute.

3
n3utrino

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

2
Miloš

Méthode simple et gratuite:

Si votre base d'utilisateurs cible n'est pas importante (moins de 1 000 personnes) et que vous souhaitez un service gratuit pour commencer, Airbop est le meilleur et le plus pratique.

Site Web Airbop Il utilise le service de messagerie Google Cloud via son API et offre de bonnes performances. Je l'ai utilisé pour deux de mes projets et sa mise en œuvre a été facile.

Des services tels que Urbanship sont excellents mais fournissent une pile de déploiement complète et pas seulement les notifications Push.

Si seul le service Push est votre cible, Airbop fonctionnera correctement.

Je n'ai pas utilisé Pushwoosh , mais c'est aussi un excellent choix. Il permet de pousser gratuitement 1 000 000 appareils

2
adimoh

C2DM: vos utilisateurs de l'application doivent avoir le compte gmail.

MQTT: lorsque votre connexion atteindra 1024, il cessera de fonctionner car il utilise "select model" de linux.

Il existe un service Push gratuit et une API pour Android, vous pouvez l'essayer: http://Push-notification.org

2
Jacky

Il y a beaucoup de serveurs tiers comme rban Airship , Xtify, Mainline , ... ce qui permet d'envoyer des messages non seulement sur Android, mais aussi sur iOs, Windows Phone ...

1
Panchine Lac

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

Voici 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 le voie. Ou peut-être que ça va s'ils le voient dans votre cas.

On dirait que cela fonctionne: Suppression de SMS à l'aide de BroadCastReceiver - Android

Oui, écrire un code comme celui-ci peut être dangereux et vous pouvez potentiellement gâcher la vie de quelqu'un parce que votre application a supprimé un SMS qu'elle n'aurait pas dû.

1
Sarel Botha

Vous pouvez utiliser Google Cloud Messaging ou GCM , c'est gratuit et facile à utiliser. Vous pouvez aussi utiliser des serveurs Push tiers comme PushWoosh , ce qui vous donne plus de flexibilité.

1
Mohsen Afshin

Firebase Cloud Messaging (FCM) est la nouvelle version de GCM. FCM est une solution de messagerie multiplateforme qui vous permet d'envoyer des messages en toute sécurité et gratuitement. Hérite de l’infrastructure centrale de GCM pour diffuser des messages de manière fiable sur Android, iOS, Web (javascript), Unity et C++.

À compter du 10 avril 2018, Google a désapprouvé GCM. Les API client et serveur GCM sont obsolètes et seront supprimées le 11 avril 2019. Google recommande de migrer les applications GCM vers Firebase Cloud Messaging (FCM), qui hérite de l'infrastructure GCM fiable et évolutive.

ressource

1
Fahed Hermoza

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 les principaux environnements d’exécution et les frameworks.

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

0
Arash Hatami