Aplicaciones sin servidor con funciones de Firebase Cloud

El objetivo de Firebase es ayudar a los desarrolladores a crear mejores aplicaciones y convertirlas en negocios exitosos. Al cuidar el back-end o la infraestructura de su aplicación, Firebase le permite concentrarse en resolver problemas para sus usuarios. Una de las nuevas características interesantes anunciadas en la conferencia Google Cloud Next '17 de marzo para Firebase fue Cloud Functions. En este tutorial, aprenderá acerca de esta nueva característica al crear una aplicación de Android simple con ella. 

¿Qué son las funciones de la nube para Firebase??

Las funciones de la nube de Firebase se ejecutan en un entorno Node.js alojado, privado y escalable donde puede ejecutar el código JavaScript. Simplemente crea funciones reactivas que se activan cada vez que ocurre un evento. Las funciones de la nube están disponibles tanto para Google Cloud Platform como para Firebase (se crearon sobre las funciones de Google Cloud). 

Por ahora, Cloud Functions admite los siguientes desencadenantes que puede escuchar y responder:

  • Activadores de base de datos en tiempo real: activa una función cuando ocurre un evento de escritura en una ruta en una base de datos.
  • Desencadenadores de autenticación: activa una función cuando se crea un nuevo usuario o cuando se elimina un usuario.
  • Desencadenadores de Analytics: activa una función cuando se registra un nuevo evento de conversión.
  • Activadores de almacenamiento en la nube: una función puede activarse cuando se produce algún cambio en un grupo, como la carga, actualización o eliminación de un archivo o carpeta..
  • Cloud Pub / Sub Triggers: activa una función cuando se recibe un nuevo mensaje en un tema de Google Cloud Pub / Sub.
  • Activadores HTTPS: se activan cuando se realiza una solicitud a un punto final.

Entonces, ¿por qué usar las funciones de la nube??

Así que ahora ha visto la gama de capacidades que pueden ofrecer las Funciones de la Nube. Pero ¿por qué usarlos?? 

La ejecución y configuración de un back-end y los servidores pueden ser una verdadera molestia, tiene que manejar problemas como la escalabilidad y la escritura de código en los idiomas del lado del servidor, pero con las Funciones de la Nube, esta complejidad se reduce. Además, las tareas de computación intensiva se pueden realizar en la nube en lugar de en el dispositivo cliente (como el cambio de tamaño de la imagen para cargar o escribir en varias rutas de su base de datos). Su código también será más seguro en la nube que en el dispositivo cliente, por lo que puede almacenar de manera segura datos como claves secretas en su servidor.. 

En este tutorial, aprenderá a usar los activadores de base de datos en tiempo real que se activarán cuando ocurra un evento de escritura en la base de datos. Luego, veremos cómo usar el servicio de mensajería en la nube de Firebase para enviar una notificación a los dispositivos suscritos a un tema. Vamos a crear una aplicación simple llamada Alertas Tutsplus, que enviará una notificación a los suscriptores del tema "android" cuando haya un nuevo artículo disponible.

Prerrequisitos 

Para seguir este tutorial, debes estar familiarizado con:

  • Base de datos en tiempo real de Firebase
  • Firebase Cloud Messaging
  • Configuración de un proyecto Firebase

Y deberías tener instalado Node.js en tu computadora.

Consulte los siguientes tutoriales aquí en Envato Tuts + si necesita ayuda para comenzar a utilizar Firebase:

1. Crear una función en la nube Firebase

Instale el CLI de Firebase 

Ahora que los requisitos previos están configurados, descarguemos Funciones de la nube.

Para comenzar a usar las Funciones de la Nube, necesitamos que la CLI (interfaz de línea de comandos) de Firebase esté instalada desde npm. Si ya tiene un nodo configurado en su máquina, puede instalar Cloud Functions con:

npm install -g firebase-tools

Este comando instalará la CLI de Firebase globalmente junto con las dependencias necesarias de Node.js.

Inicializar el proyecto

Para inicializar tu proyecto:

  1. correr inicio de sesión de firebase para iniciar sesión en Firebase a través del navegador y autenticar la herramienta CLI.
  2. Crear un nuevo directorio de proyecto con el nombre. tutsplus-alertas.
  3. Por fin correr funciones de inicio de base de fuego de ese nuevo directorio. Esta herramienta le da una opción para instalar dependencias con NPM. Es seguro rechazar si desea administrar las dependencias de otra manera.

Después de que estos comandos se completen con éxito, la estructura de su proyecto se ve así:

  • .firebaserc: un archivo oculto que le ayuda a cambiar rápidamente entre proyectos con uso de base de fuego.
  • firebase.json: describe propiedades para tu proyecto.
  • funciones /: esta carpeta contiene todo el código para tus funciones.
  • funciones / paquete.json: un archivo de paquete NPM que describe sus funciones en la nube.
  • funciones / index.js: la fuente principal de tu código de Cloud Functions.
  • funciones / node_modules /: la carpeta donde están instaladas todas sus dependencias NPM.

Importe los módulos necesarios e inicialice la aplicación 

Para desarrollar nuestra sencilla aplicación Tutsplus Alerts, solo necesitamos dos módulos de nodo: Funciones de nube y módulos de SDK de administración (estos módulos ya están instalados para nosotros). Así que ve a la index.js y requiere estos módulos, y luego inicializa una instancia de la aplicación de administración.

var functions = require ('firebase-functions'); var admin = require ('firebase-admin'); admin.initializeApp (functions.config (). firebase);

Codificar la función de la nube

Ahora que los módulos necesarios para nuestro proyecto se han importado e inicializado, codifiquemos nuestra función de nube en el index.js expediente. Como se dijo anteriormente, vamos a escribir una función que se activará cuando un onWrite () El evento ocurre en nuestra base de datos en tiempo real de Firebase y luego, en respuesta, enviará una notificación (un mensaje posterior) a los suscriptores del dispositivo..

// ... exports.sendNotification = functions.database.ref ('/ articles / articleId') .onWrite (event => // Capture el valor actual de lo que se escribió en la base de datos en tiempo real. Var eventSnapshot = event.data ; var str1 = "El autor es"; var str = str1.concat (eventSnapshot.child ("author"). val ()); console.log (str); var topic = "android"; var payload = data: title: eventSnapshot.child ("title"). val (), author: eventSnapshot.child ("author"). val (); // Enviar un mensaje a los dispositivos suscritos al tema provisto. return admin.messaging () .sendToTopic (topic, payload) .then (function (response) // Consulte la documentación de referencia de MessagingTopicResponse para // los contenidos de la respuesta. console.log ("Mensaje enviado con éxito:", response);) .catch (función (error) console.log ("Error al enviar el mensaje:", error);););

En el código anterior, estamos escuchando la ruta de la base de datos. / articles / articleId, dónde ID del artículo representa el id del artículo que fue escrito con éxito. Ahora, lo que realmente nos preocupa es la información que se escribió. Para conseguir eso, usamos event.data, que es una interfaz estática de DeltaSnapshot. 

Luego, agregue los datos de esta instantánea a la carga útil de un mensaje y envíelos al tema "android". El código asíncrono se simplifica con promesas de JavaScript.. 

Tenga en cuenta que en el código anterior, escribimos a la consola utilizando console.log (), Lo que nos ayudará en la depuración y seguimiento. Podemos ver este registro en nuestro panel de Firebase o mediante la línea de comandos con: 

funciones de base de fuego: registro

Tenga en cuenta que, como esto se ejecuta en Node.js, puede instalar otros módulos disponibles desde NPM. También puede codificar JavaScript ES6 o TypeScript en lugar de JavaScript vainilla. 

Implementar la función de nube

Vamos a implementar nuestra función de nube. Ejecute este comando para la implementación:

$ firebase despliegue - solo funciones

Ahora podemos codificar la aplicación de Android que se suscribirá al tema, escribir en la base de datos en tiempo real y recibir una notificación cuando los datos se escriban en nuestra base de datos en tiempo real, es decir, cuando se ejecutaría nuestra función de nube.! 

2. Crea la aplicación TutsplusAlerts

Crear un proyecto de Android Studio

Primero, inicie Android Studio y cree un nuevo proyecto "TutsplusAlerts"con una actividad vacía llamada Actividad principal.

Para seguir adelante, asegúrese de haber integrado Firebase en su aplicación. 

Agregue la dependencia de la base de datos en tiempo real

Agregue la siguiente dependencia a su construir.gradle expediente:

compile 'com.google.firebase: firebase-database: 10.2.1' 

Asegúrate de sincronizar tu proyecto después de agregarlo.

Crear el modelo

Vamos a modelar una entidad de artículo para que sea persistida en nuestra base de datos en tiempo real.

Artículo de clase pública título de la cadena pública; autor de cuerdas pública; Artículo público () // Constructor predeterminado requerido para llamadas a DataSnapshot.getValue (Article.class) Artículo público (título de la cadena, autor de la cadena) this.title = title; this.author = autor; 

Crear el diseño XML 

Nuestro diseño XML para la actividad principal tendrá solo dos. EditTexts Y solo un botón que enviará el nuevo artículo..

    

Escribir en la base de datos en tiempo real

Ahora vamos a escribir a la ruta de la base de datos en tiempo real. /artículos/.

// ... @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); base de datos FirebaseDatabase final = FirebaseDatabase.getInstance (); final EditText titleEditText = (EditText) findViewById (R.id.et_title); final EditText authorEditText = (EditText) findViewById (R.id.et_author); Button submitButton = (Button) findViewById (R.id.btn_submit); submitButton.setOnClickListener (new View.OnClickListener () @Override public void onClick (Vista de vista) DatabaseReference myRef = database.getReference ("articles"). push (); Artículo artículo = Nuevo artículo (titleEditText.getText (). .String (), authorEditText.getText (). toString ()); myRef.setValue (article););  //… 

Su aplicación necesitará acceso de escritura a la base de datos. Solo para fines de demostración, puede configurar sus Reglas de seguridad para permitir todas las lecturas y escrituras. En una aplicación real, nunca querría usar una configuración de seguridad tan insegura.

"rules": ".read": "true", ".write": "true"

Puede obtener más información sobre las Reglas de seguridad de Firebase en mi publicación aquí en Envato Tuts+.

Ejecutar la aplicación

En esta etapa, podemos probar la aplicación y ver si nuestra función de nube se ejecutó correctamente. Ingrese un título y autor, y luego haga clic en el botón enviar. Después de eso, visite el Funciones Panel de control y ver los registros. Nuestro registro personalizado debe aparecer.

En los registros anteriores, vemos que hemos ejecutado con éxito nuestra función de nube y hemos enviado un mensaje con una carga útil a los dispositivos suscritos al 'androide'tema, pero ningún dispositivo se ha suscrito al tema todavía. En la siguiente sección, usaremos Firebase Cloud Messaging para que los dispositivos puedan suscribirse a un tema y luego procesen el mensaje entrante del servidor para mostrar una notificación.. 

3. Agregar soporte de mensajería en la nube de Firebase

Incluir la dependencia 

Incluya la dependencia de Firebase Messaging en su construir.gradle archiva y sincroniza tu proyecto después:

compile 'com.google.firebase: firebase-messaging: 10.2.1'

Manejo de mensajes

Necesitamos crear un servicio que extienda FirebaseMessagingService y anule el onMessageReceived devoluciones de llamada. 

paquete com.chikeandroid.tutsplusalerts; importar com.google.firebase.messaging.FirebaseMessagingService; importar com.google.firebase.messaging.RemoteMessage; importar android.app.NotificationManager; importar android.app.PendingIntent; importar android.content.Context; import android.content.Intent; importar android.media.RingtoneManager; importar android.net.Uri; importar android.support.v4.app.NotificationCompat; clase pública MyFirebaseMessagingService extiende FirebaseMessagingService @Override public void onMessageReceived (RemoteMessage remoteMessage) // Compruebe si el mensaje contiene una carga útil de datos. if (remoteMessage.getData (). size ()> 0) showNotification (remoteMessage.getData (). get ("title"), remoteMessage.getData (). get ("author"));  // Compruebe si el mensaje contiene una carga útil de notificación. if (remoteMessage.getNotification ()! = null)  showNotification void privado (String title, String author) Intent intent = new Intent (this, MainActivity.class); intent.addFlags (Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent = PendingIntent.getActivity (esto, 0 / * Código de solicitud * /, intención, PendingIntent.FLAG_ONE_SHOT); Uri defaultSoundUri = RingtoneManager.getDefaultUri (RingtoneManager.TYPE_NOTIFICATION); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder (this) .setContentTitle ("New Article:" + title) .setSmallIcon (R.mipmap.ic_launcher) .setContentText ("By" + autor) .setAutoCancel (true) .setSound (defaultSoundUri) ) .setContentIntent (pendingIntent); NotificationManager notificationManager = (NotificationManager) getSystemService (Context.NOTIFICATION_SERVICE); notificationManager.notify (0 / * ID de notificación * /, notificationBuilder.build ()); 

En el código anterior, también obtenemos la carga útil de datos y la mostramos en una notificación, independientemente de si la aplicación se encuentra en primer plano o en segundo plano..  

Actualizar el archivo de manifiesto

Actualice el archivo de manifiesto, incluido el servicio creado anteriormente dentro del etiqueta.

//…      //… 

Suscribirse a un tema

Finalmente, debemos suscribirnos al tema 'androide'para que el dispositivo pueda recibir y procesar mensajes enviados a ese tema. 

/ ... @Override protected void onCreate (Bundle savedInstanceState) // ... FirebaseMessaging.getInstance (). SubscribeToTopic ("android"); //… //… 

Ejecutar la aplicación 

Ejecute la aplicación por segunda vez e ingrese un título y un autor, y luego haga clic en el botón Enviar. Esta vez, se mostrará una notificación cada vez que un usuario de la aplicación publique un nuevo artículo en la base de datos..

Para hacer esto antes de Cloud Functions, habría necesitado un servidor HTTP o XMPP, lo que significaría más código para escribir, así como un servidor para configurar y admitir.

Conclusión

En este tutorial, aprendió sobre las funciones de la nube para Firebase: qué son, por qué podría necesitarlas y cómo comenzar a usar las funciones de la nube para su aplicación. Tenga en cuenta que Cloud Functions for Firebase aún se encuentra en versión beta pública en el momento de esta publicación.. 

Para obtener más información sobre Cloud Functions for Firebase, consulte la documentación oficial. Y mientras tanto, echa un vistazo a algunos de nuestros otros cursos y tutoriales sobre el desarrollo de aplicaciones para Android!