Notificaciones Push en la plataforma Android

Estoy buscando escribir una aplicación que reciba alertas enviadas desde un servidor. Encontré un par de métodos para hacer esto.

  1. SMS: intercepte el SMS entrante e inicie una extracción desde el servidor
  2. Encuestar al servidor periódicamente

Cada uno tiene sus propias limitaciones. SMS: no hay garantía de tiempo de llegada. La encuesta puede drenar la batería.

¿Tienes una mejor sugerencia, por favor? Muchas gracias.

La respuesta oficial de Google es el marco de mensajería de nube a dispositivo de Android (obsoleto) Google Cloud Messaging (obsoleto) Firebase Cloud Messaging

Funcionará en Android> = 2.2 (en teléfonos que tienen Play Store).

( publicación cruzada de una respuesta que di a una pregunta similar: ¿Admite Android la notificación de inserción casi en tiempo real? )

Recientemente comencé a jugar con MQTT http://mqtt.org para Android como una forma de hacer este tipo de cosas (es decir, notificación push que no es SMS, sino transmisión de datos, envío de mensajes casi inmediato, no sondeo, etc.)

Tengo una publicación en el blog con información de antecedentes sobre esto en caso de que sea útil

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

(Nota: MQTT es una tecnología de IBM, y debo señalar que trabajo para IBM).

Marco de mensajería de nube a dispositivo de Android

Importante: C2DM ha sido oficialmente obsoleto desde el 26 de junio de 2012. Esto significa que C2DM ha dejado de aceptar nuevos usuarios y solicitudes de cuotas. No se agregarán nuevas características a C2DM. Sin embargo, las aplicaciones que usan C2DM seguirán funcionando. Se anima a los desarrolladores actuales de C2DM a migrar a la nueva versión de C2DM, llamada Google Cloud Messaging para Android (GCM). Consulte el documento Migración de C2DM a GCM para obtener más información. Los desarrolladores deben usar GCM para un nuevo desarrollo.

Por favor revise el siguiente enlace:

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

Aquí he escrito algunos pasos para Cómo obtener RegID y notificación comenzando desde cero

  1. Crear / Registrar aplicación en Google Cloud
  2. Configurar Cloud SDK con desarrollo
  3. Configurar proyecto para GCM
  4. Obtener ID de registro de dispositivo
  5. Enviar notificaciones automáticas
  6. Recibir notificaciones push

Puede encontrar un tutorial completo en el siguiente enlace URL

Primeros pasos con Android Push Notification: Último Google Cloud Messaging (GCM) – paso a paso completo tutorial

enter image description here

Recorte de código para obtener la ID de registro (Token de dispositivo para notificación push).

Configurar proyecto para GCM


Actualizar el archivo AndroidManifest

Para habilitar GCM en nuestro proyecto, necesitamos agregar algunos permisos en nuestro archivo de manifiesto Vaya a AndroidManifest.xml y agregue el código siguiente Agregar permiso

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

Agregar la statement del receptor de difusión GCM

agregue la statement del receptor de difusión de GCM en su etiqueta de aplicación

        

Agregar statement GCM Servie

   

Obtener ID de registro (token de dispositivo para notificación push)

Ahora ve a tu actividad de lanzamiento / salpicadura

Agregar constantes y variables de clase

 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; 

Actualizar los métodos OnCreate y 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); } 

Nota : por favor, guarde REGISTRATION_KEY, es importante para enviar PN Message a GCM y también guarde en el mío, esto será único para todos los dispositivos, al usar esto, solo GCM enviará Push Notification.

Recibir notificaciones push

Agregar GCM Broadcast Receiver Class

Como ya hemos declarado “GcmBroadcastReceiver.java” en nuestro archivo de Manifiesto, así que vamos a crear este código de clase de receptor de actualización de clase de esta manera

 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(); } } 

Agregar clase de servicio GCM

Como ya hemos declarado “GcmBroadcastReceiver.java” en nuestro archivo de Manifiesto, así que vamos a crear este código de clase de receptor de actualización de clase de esta manera

 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()); } } 

Mi comprensión / experiencia con la notificación push de Android son:

  1. C2DM GCM : si su plataforma de destino de Android es 2.2+, entonces opta por ella. Solo una cosa, los usuarios de dispositivos deben estar siempre conectados con una cuenta de Google para recibir los mensajes.

  2. MQTT : enfoque basado en Pub / Sub, necesita una conexión activa desde el dispositivo, puede drenar la batería si no se implementa de manera sensata.

  3. Diácono : puede que no sea bueno a largo plazo debido al limitado apoyo de la comunidad.

Editar : Agregado el 25 de noviembre de 2013

GCM – Google dice …

Para dispositivos pre-3.0, esto requiere que los usuarios configuren su cuenta de Google en sus dispositivos móviles. Una cuenta de Google no es un requisito en dispositivos con Android 4.0.4 o superior. *

Hay un nuevo esfuerzo de código abierto para desarrollar una biblioteca Java para notificaciones push en Android basadas en el servidor web Meteor. Puede consultarlo en Deacon Project Blog , donde encontrará enlaces a Meteor y al repository GitHub del proyecto. Necesitamos desarrolladores, ¡por favor, hagan correr la voz!

Puede usar Xtify ( http://developer.xtify.com ); tienen un servicio web de notificaciones push que funciona con su SDK. es gratis y hasta ahora, funcionó muy bien para mí.

o….

3) Mantenga una conexión con el servidor, envíe keep-alives cada pocos minutos, y el servidor puede enviar mensajes instantáneamente. Así es como funcionan Gmail, Google Talk, etc.

Recomiendo usar GCM – Google Cloud Messaging para Android. Es gratis, y para usos simples debería ser muy fácil.

Sin embargo, es necesario mantener un tercer servidor lateral para enviar las notificaciones en su nombre. Si quiere evitar que existan algunas soluciones industriales muy buenas para el servicio de notificaciones push de Android:

  • Urban Airship : libere hasta 1 millón de notificaciones por mes, luego se le cobrará por cada 1000 notificaciones
  • PushApps : gratis para notificaciones de 1M por mes y notificaciones ilimitadas de 19,99 por mes
  • PushWoosh : gratis para dispositivos de 1M, los planes premium son de 39 euros

Diclaimer : trabajo en PushApps y también uso su producto en mis aplicaciones durante más de un año.

A partir del 18 de mayo de 2016, Firebase es la plataforma unificada de Google para desarrolladores de dispositivos móviles que incluye notificaciones automáticas.

Me temo que has encontrado ambos métodos posibles. Google, al menos inicialmente, implementaría una API de GChat que podría usar para una implementación push / pull. Lamentablemente, esa biblioteca fue cortada por Android 1.0.

No sé si esto todavía es útil. Logré algo así con una biblioteca de Java en http://www.pushlets.com/

Aunque hacerlo en un servicio no impedirá que Android lo cierre y mate el hilo del oyente.

Google C2DM se depreció ahora, para eso, tiene o usar el nuevo servicio GCM (Google Cloud Messaging). Para documantation, consulte http://developer.android.com/guide/google/gcm/gs.html

C2DM: los usuarios de tu aplicación deben tener la cuenta de Gmail.

MQTT: cuando su conexión alcanzó 1024, dejará de funcionar porque usó “seleccionar modelo” de Linux.

Hay un servicio push gratuito y una API para Android, puedes probarlo: http://push-notification.org

Método libre y fácil:

Si su base de usuarios objective no es grande (menos de 1000) y desea un servicio gratuito para comenzar, entonces Airbop es la mejor y más conveniente.

Sitio web de Airbop Utiliza el servicio Google Cloud Messaging a través de su API y proporciona un buen rendimiento. Lo he usado para dos de mis proyectos y fue fácil implementarlo.

Los servicios como Urbanship son excelentes, pero proporcionan una stack completa de implementación y no solo las notificaciones push.

Si solo tu servicio es el servicio push, Airbop funcionará bien.

No he usado Pushwoosh , pero también es una gran elección. Permite empujar a 1,000,000 dispositivos gratis

Sugeriría usar tanto SMS como HTTP. Si el usuario no está conectado, envíele un SMS a su teléfono para notificarle que hay un mensaje esperando.

Así es como funciona este servicio de Ericsson Labs: https://labs.ericsson.com/apis/mobile-java-push/

Si implementa esto usted mismo, la parte más difícil es eliminar el SMS entrante sin que el usuario lo vea. O tal vez está bien si lo ven en tu caso.

Parece que esto funciona: Eliminando SMS usando BroadCastReceiver – Android

Sí, escribir código como este puede ser peligroso y potencialmente puede arruinar la vida de alguien porque su aplicación eliminó un SMS que no debería tener.

Puede usar Google Cloud Messaging o GCM , es gratis y fácil de usar. También puede usar servidores de inserción de terceros como PushWoosh que le da más flexibilidad

Hay muchos servidores de terceros como Urban Airship , Xtify, Mainline , … que permiten enviar no solo en Android, sino también en iOs, Windows Phone …

Puedes usar Pusher

Es un servicio alojado que hace que sea super fácil agregar datos y funcionalidades en tiempo real a aplicaciones web y móviles.
Pusher ofrece bibliotecas para integrarse en los principales entornos de ejecución y marcos.

PHP, Ruby, Python, Java, .NET, Go and Node en el servidor
JavaScript, Objective-C (iOS) and Java (Android) en el cliente.

Intereting Posts