Cómo empezar con notificaciones push en Android

Introducción

Lograr que los usuarios instalen tu aplicación es solo la mitad de la batalla. Conseguir que lo usen regularmente es la otra mitad. Es muy posible que sus usuarios se olviden completamente de su aplicación después de usarla solo una o dos veces. Lo que con todas las otras nuevas aplicaciones compiten por su atención..

Al utilizar notificaciones push, puede recordar a los usuarios su aplicación de vez en cuando, lo que mejora las posibilidades de que su aplicación permanezca instalada en sus dispositivos.

Google Cloud Messaging, GCM para abreviar, es un servicio gratuito que puede utilizar para enviar notificaciones automáticas a sus usuarios. En este tutorial, aprenderá cómo usarlo para crear una aplicación de Android que pueda recibir notificaciones push y un simple script de Python del lado del servidor que puede generar y enviarlos..

¿Por qué usar Google Cloud Messaging??

Para la mayoría de las comunicaciones cliente-servidor, el cliente inicia solicitudes para recibir datos del servidor. En otras palabras, el cliente extrae datos del servidor. En el caso de notificaciones push, sin embargo, es el servidor el que inicia la transferencia de datos..

Esto generalmente se logra manteniendo una conexión TCP / IP persistente, una conexión que permanece abierta indefinidamente, entre el servidor y el cliente. Eso puede sonar muy bien, pero si tiene una aplicación popular, mantener miles de conexiones persistentes entre su servidor y los dispositivos de sus usuarios puede ser muy costoso.

Google Cloud Messaging es un servicio que resuelve este problema actuando como intermediario entre su servidor y el dispositivo de su usuario. Con GCM, el servidor de conexión en la nube de Google, a menudo denominado CCS, administra las conexiones persistentes por usted. También se asegura de que sus notificaciones push sean entregadas de forma segura y confiable.

Prerrequisitos

Para seguir conmigo, necesitas:

  • La última versión de Android Studio
  • Python 2.7.6 o superior
  • un dispositivo con Android 4.4 o superior con Google Play Services instalado

1. Configuración del proyecto de Android Studio

Inicie Android Studio y cree un nuevo proyecto con un vacío Actividad. Si usó los valores predeterminados, el proyecto debería incluir una clase Java en MainActivity.java.

Paso 1: Añadir las dependencias

En este proyecto, usaremos el complemento de servicios de Google para configurar GCM. Inclúyalo en el proyecto agregando la siguiente línea en el dependencias sección del proyecto construir.gradle:

groovy classpath 'com.google.gms: google-services: 1.5.0'

A continuación, aplique el plugin en el aplicación módulo de construir.gradle:

maravilloso aplique el complemento: 'com.google.gms.google-services'

Para poder utilizar la API de GCM, agregue com.google.android.gms: play-services como un compilar Dependencia en el mismo archivo:

compilación maravillosa "com.google.android.gms: play-services: 8.3.0"

Si hace clic en el Sincronizar ahora botón, debería ver el siguiente error:

Haga clic en el Instalar repositorio y sincronizar proyecto enlace para corregir el error.

Paso 2: Actualizar el Manifiesto

Dentro del proyecto AndroidManifest.xml archiva, crea y utiliza un personalizado C2D_MESSAGE permiso basado en el nombre del paquete de su proyecto. Asegúrese de que el nivel de protección del permiso se establece en firma.

"xml

"

Las notificaciones se reciben en forma de emisiones. Para manejar esas transmisiones, nuestra aplicación necesita un Receptor de radiodifusión. Sin embargo, no tenemos que crearlo manualmente. En lugar de eso podemos usar el GcmReceptor clase como la Receptor de radiodifusión.

los Receptor de radiodifusión debe tener un filtro de intención que responde a la com.google.android.c2dm.intent.RECEIVE acción y el nombre de su categoría debe coincidir con el nombre del paquete de su proyecto. Agregue el siguiente código al manifiesto:

"xml

"

2. Obtenga una clave de API de servidor y una ID de remitente

Al comunicarnos con el servidor de conexión en la nube, debemos identificarnos utilizando una clave API en el lado del servidor y una identificación del remitente en el lado del cliente. Para obtener la clave API y la ID del remitente, cree un nuevo proyecto en la consola de desarrolladores.

Comience haciendo clic en el Elige una plataforma botón. A continuación, haga clic en Habilitar servicios para mi aplicación de Android botón. Cuando lo haga, se le pedirá que proporcione un nombre y un nombre de paquete de Android para su aplicación. Asegúrese de que el nombre del paquete de Android que proporcione coincida con el nombre del paquete que ingresó cuando creó el proyecto de Android Studio.

A continuación, haga clic en Elegir y configurar servicios. botón en la parte inferior. Ahora puede seleccionar los servicios de Google que desea agregar a la aplicación.

Por ahora, haga clic en Mensajería en la nube botón y luego haga clic Habilitar la mensajería de Google Cloud. Después de unos segundos, se le presentará la clave API del servidor y la ID del remitente. Tome nota de la clave API del servidor y presione Cerrar.

El complemento de Servicios de Google que agregamos anteriormente necesita un archivo de configuración para funcionar correctamente. Genere el archivo haciendo clic en el Generar archivos de configuración. botón.

Una vez que se haya generado el archivo, descárguelo y colóquelo dentro de su proyecto de Android Studio aplicación directorio.

3. Registro del cliente.

GCM identifica dispositivos Android utilizando tokens de registro. Por lo tanto, nuestra aplicación debe poder registrarse desde cualquier dispositivo Android en el que esté instalada..

Paso 1: Crear un servicio de registro

El registro se debe realizar en un subproceso en segundo plano porque el proceso puede tardar un tiempo dependiendo de la conectividad de la red. Debido a que el registro no necesita ninguna entrada del usuario, un Servicio de Intención es ideal para esta tarea.

Crear una nueva clase de Java llamada RegistrationService.java, hazlo una subclase de Servicio de Intención, y anular su onHandleIntent método.

"java public class RegistrationService extiende IntentService public RegistrationService () super (" RegistrationService ");

@ Anular la protección del vacío en HandleIntent (Intención de intención)  "

Dentro de onHandleIntent En este método, podemos usar la API de ID de instancia para generar o recuperar el token de registro. Primero, crea una instancia de ID de instancia clase, usando su obtener Instancia método.

java InstanceID myID = InstanceID.getInstance (this);

Ahora podemos usar el GetToken método de la ID de instancia objeto de obtener el token de registro en forma de Cuerda. GetToken espera el ID del remitente como uno de sus argumentos. Porque hemos añadido el google-services.json archivo a nuestro proyecto, podemos pasar la ID del remitente al método usando R.string.gcm_defaultSenderID.

java String registrationToken = myID.getToken (getString (R.string.gcm_defaultSenderId), GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);

Si desea ver el contenido del token de registro para fines de depuración, puede registrarlo como un mensaje de depuración utilizando la Log.d método.

java Log.d ("Token de registro", registrationToken);

En este punto, podría enviar el token de registro a su servidor web y almacenarlo en una base de datos allí. Sin embargo, no tiene que hacer esto si no planea dirigirse a sus usuarios individualmente. Si planea enviar el mismo mensaje a todos los usuarios, debe seguir el enfoque de publicación-suscripción..

Ahora te mostraré cómo suscribirte a un tema llamado my_little_topic. Solo toma dos líneas de código. Primero, crea una nueva instancia de GcmPubSub clase usando su obtener Instancia método. A continuación, llame a su suscribir Método y pasarle el token de registro, junto con el nombre del tema.

Suscripción a Java GcmPubSub = GcmPubSub.getInstance (this); suscripción.subscribe (registrationToken, "/ topics / my_little_topic", null);

Nuestra aplicación ahora puede recibir cada notificación de inserción publicada en my_little_topic.

Finalmente, defina el servicio en AndroidManifest.xml.

"xml

"

El servicio de registro está completo..

Paso 2: Crea una InstanceIDListenerService

Los tokens de registro se actualizan periódicamente. En consecuencia, cada aplicación de Android que utiliza GCM debe tener un InstanceIDListenerService que puede manejar esos refrescos. Por lo tanto, crea un nuevo archivo Java llamado TokenRefreshListenerService.java y convertirlo en una subclase de InstanceIDListenerService. Dentro de onTokenRefresh método de la clase, todo lo que tenemos que hacer es simplemente comenzar de nuevo el proceso de registro iniciando el servicio de registro usando un Intención y el Empieza el servicio método.

Agregue el siguiente código a TokenRefreshListenerService.java:

java public class TokenRefreshListenerService extiende InstanceIDListenerService @Override public void onTokenRefresh () Intent i = new Intent (this, RegistrationService.class); servicio de inicio (i);

Este servicio debe ser capaz de responder a la com.google.android.gms.iid.InstanceID acción. Por lo tanto, al definir el servicio en AndroidManifest.xml, agregue el apropiado filtro de intención.

"xml

"

Paso 3: Iniciar el servicio de registro

Para asegurarnos de que el proceso de registro comience tan pronto como se inicie la aplicación, debemos iniciar la Servicio de registro clase dentro del onCreate método de Actividad principal. Para ello, crea un Intención para ello y utilizar el Empieza el servicio método.

java Intent i = new Intent (this, RegistrationService.class); servicio de inicio (i);

4. Visualización de notificaciones push

GCM muestra automáticamente notificaciones push en la bandeja de notificaciones tan pronto como se reciben. Sin embargo, solo lo hace si la aplicación asociada contiene un GCMListenerService.

Crear una nueva clase de Java llamada NotificacionesListenerService y convertirlo en una subclase de GCMListenerService. A menos que quiera manejar los datos enviados usted mismo, no tiene que escribir ningún código dentro de esta clase. Podemos dejar esta clase en blanco por ahora..

"java public class NotificationsListenerService extiende GcmListenerService

"

Al definir el servicio en AndroidManifest.xml, asegúrese de agregar un filtro de intención que le permite responder a la com.google.android.c2dm.intent.RECEIVE acción.

"xml

"

5. Agregar iconos de notificación push

Cada notificación de inserción debe tener un icono asociado. Si no tiene uno a mano, puede obtener uno de la Biblioteca de iconos de diseño de materiales de Google.

Una vez que descargue el icono, colóquelo dentro de la res Carpeta de tu proyecto. Estaré usando ic_cloud_white_48dp como el icono.

6. Ejecutando la aplicación de Android

Nuestra aplicación de Android ya está completa. Una vez que lo compile y lo ejecute en un dispositivo Android, podrá ver el token de registro en el logcat troncos.

Presione el botón Atrás en su dispositivo para salir de la aplicación. Esto es necesario porque GCM mostrará notificaciones automáticas solo si el usuario no está usando la aplicación. Si desea que se muestren las notificaciones incluso cuando la aplicación se está ejecutando, tendrá que crear las notificaciones usted mismo dentro NotificacionesListenerService utilizando la Notification.Builder clase.

7. Envío de notificaciones push

En la parte final de este tutorial, crearemos un simple script de Python que puede generar y enviar notificaciones push a todos los dispositivos Android en los que está instalada nuestra aplicación..

Puede ejecutar este script desde su computadora local o desde un servidor web remoto al que tenga acceso SSH.

Paso 1: Creando el Script

Crear un nuevo archivo llamado enviar.py y ábrelo usando tu editor de texto favorito.

En la parte superior del archivo, importe el urllib2 y urllib módulos Utilizaremos estos módulos para enviar datos al servidor de conexión en la nube de Google. Importar el json Módulo también porque los datos que enviamos deben ser JSON válidos. Por último, para acceder a los argumentos de la línea de comandos, importe el sys módulo.

python from urllib2 import * import urllib import json import sys

A continuación, cree una variable que almacene la clave API del servidor de la que tomó nota anteriormente. La clave debe ser parte de cada solicitud HTTP que hacemos al CCS.

python MY_API_KEY = "ABCDEF123456789ABCDE - 12A"

Cada notificación debe tener un título y un cuerpo. En lugar de codificarlos en nuestra secuencia de comandos, aceptemos el título y el cuerpo como argumentos de línea de comando utilizando el argv formación.

python messageTitle = sys.argv [1] messageBody = sys.argv [2]

Cree un nuevo objeto de diccionario de Python para representar los datos que deben enviarse al CCS. Para que nuestra aplicación de Android pueda recibir la notificación, debe publicarse en un tema llamado my_little_topic. Por lo tanto, agregue una clave llamada a al diccionario y establecer su valor en / topics / my_little_topic.

Para representar el contenido de la notificación, agregue una clave llamada notificación al diccionario y establezca su valor en otro objeto del diccionario que contiene tres claves:

  • cuerpo
  • título
  • icono

Asegúrese de que el valor de la icono la tecla coincide con el nombre del icono que se puede dibujar en tu proyecto de Android.

python data = "to": "/ topics / my_little_topic", "notification": "body": messageBody, "title": messageTitle, "icon": "ic_cloud_white_48dp"

Convierta el diccionario a una cadena JSON usando el deshecho función de la json módulo:

python dataAsJSON = json.dumps (datos)

Todo lo que tenemos que hacer ahora es enviar la cadena JSON a https://gcm-http.googleapis.com/gcm/send. Para ello, crea un nuevo Solicitud objeto y conjunto dataAsJSON como sus datos. A continuación, establezca la Autorización encabezado a MY_API_KEY y el Tipo de contenido encabezado a aplicación / json.

python request = Request ("https://gcm-http.googleapis.com/gcm/send", dataAsJSON, "Authorization": "key =" + MY_API_KEY, "Content-type": "application / json")

Finalmente, para ejecutar la solicitud y obtener la respuesta, pase el objeto de solicitud a la urlopen funciona y llama a su leer método.

python print urlopen (request) .read ()

El script de Python ahora está completo y listo para usar.

Paso 2: Ejecutando el Script

En este punto, estamos listos para enviar notificaciones automáticas a todos los dispositivos en los que está instalada nuestra aplicación. Abra una terminal e ingrese el directorio en el que creó enviar.py.

Pase el nombre del script a la pitón ejecutable junto con una cadena para el título de la notificación y una para el cuerpo de la notificación. Aquí hay un ejemplo que puedes usar:

bash python send.py "Mi primera notificación de inserción" "¡GCM API es maravilloso!"

Si no hay errores, debería obtener una respuesta como esta:

javascript "message_id": 12345676892321

Si verifica su dispositivo Android, debería ver una nueva notificación en la bandeja de notificaciones.

Conclusión

Ahora sabes cómo enviar notificaciones push a tus usuarios. En esta lección, aprendió cómo crear una aplicación de Android capaz de registrarse y recibir notificaciones que se publican sobre un tema específico. También aprendió a crear un script de Python que puede publicar notificaciones.

A pesar de que las notificaciones push pueden parecer una excelente forma de comunicarse con sus usuarios, le sugiero que las use con moderación y solo si tiene algo útil que decir, ya que enviar demasiadas veces es la forma más rápida de obtener su aplicación. desinstalado.

Para obtener más información sobre Google Cloud Messaging, consulte la Guía de Cloud Messaging..