Envía notificaciones para una app web con Cloud Messaging y Cloud Functions

1. Descripción general

En este codelab, aprenderás a usar Cloud Functions para Firebase y agregarás funcionalidad a una app web de chat mediante el envío de notificaciones a los usuarios de esa app.

3b1284f5144b54f6.png

Qué aprenderás

  • Cómo usar el SDK de Firebase para crear funciones de Google Cloud Functions
  • Cómo activar funciones de Cloud Functions basadas en eventos de Auth, Cloud Storage y Cloud Firestore
  • Cómo agregar compatibilidad con Firebase Cloud Messaging a su aplicación web

Requisitos

  • Una tarjeta de crédito. Cloud Functions para Firebase requiere el plan Blaze de Firebase, lo que significa que deberás habilitar la facturación en tu proyecto de Firebase con una tarjeta de crédito.
  • El editor de texto o IDE que prefieras, como WebStorm, Atom o Sublime.
  • Una terminal para ejecutar comandos de shell con NodeJS v9 instalado
  • Un navegador, como Chrome
  • El código de muestra Consulta el siguiente paso.

2. Obtén el código de muestra

Clona el repositorio de GitHub desde la línea de comandos:

git clone https://github.com/firebase/friendlychat

Importa la app de partida

Con tu IDE, abre o importa el directorio carpeta_android_studio.pngcloud-functions-start del directorio del código de muestra. Este directorio contiene el código de inicio para el codelab, que consta de una app web de chat completamente funcional.

3. Crea un proyecto de Firebase y configura tu app

Crear proyecto

En Firebase console, haz clic en Agregar proyecto y llámalo FriendlyChat.

Haz clic en Crear proyecto.

Actualiza al plan Blaze

Si quieres usar Cloud Functions para Firebase, deberás actualizar tu proyecto de Firebase al plan de facturación Blaze. Para ello, deberás agregar una tarjeta de crédito o algún otro instrumento de facturación a tu cuenta de Google Cloud.

Todos los proyectos de Firebase, incluidos los del plan Blaze, aún tienen acceso a las cuotas de uso gratuito de Cloud Functions. Los pasos que se describen en este codelab se encuentran dentro de los límites de uso del nivel gratuito. Sin embargo, verás pequeños cargos (aproximadamente $0.03) de Cloud Storage que se usa para alojar tus imágenes de compilación de Cloud Functions.

Si no tienes acceso a una tarjeta de crédito o te incomoda continuar con el plan Blaze, considera usar Firebase Emulator Suite, que te permitirá emular Cloud Functions de forma gratuita en tu máquina local.

Habilitar la autenticación de Google

Para permitir que los usuarios accedan a la app, usaremos la autenticación de Google, que debe estar habilitada.

En Firebase console, abre la sección Compilación > Autenticación > pestaña Método de acceso (o haz clic aquí para ir allí). Luego, habilita el proveedor de acceso de Google y haz clic en Guardar. Esto permitirá a los usuarios acceder a la app web con sus Cuentas de Google.

Además, puedes configurar el nombre público de tu app como Friendly Chat:

8290061806aacb46.png

Habilita Cloud Storage

La app usa Cloud Storage para subir fotos. Para habilitar Cloud Storage en tu proyecto de Firebase, visita la sección Storage y haz clic en el botón Comenzar. Sigue los pasos y, en la ubicación de Cloud Storage, habrá un valor predeterminado para usar. Luego, haz clic en Listo.

Agrega una app web

En Firebase console, agrega una app web. Para ello, ve a Configuración del proyecto y desplázate hacia abajo hasta Agregar app. Selecciona Web como la plataforma y marca la casilla para configurar Firebase Hosting. Luego, registra la app y haz clic en Siguiente para seguir los pasos restantes. Por último, haz clic en Ir a la consola.

4. Instala la interfaz de línea de comandos de Firebase

La interfaz de línea de comandos (CLI) de Firebase te permitirá entregar la app web de forma local, además de implementar la app web y Cloud Functions.

Para instalar o actualizar la CLI, ejecuta el siguiente comando npm:

npm -g install firebase-tools

Para verificar que la CLI se haya instalado de forma correcta, abre una consola y ejecuta lo siguiente:

firebase --version

Asegúrate de que la versión de Firebase CLI sea superior a 4.0.0 de modo que tenga todas las funciones más recientes necesarias para Cloud Functions. De lo contrario, ejecuta npm install -g firebase-tools para realizar la actualización como se muestra más arriba.

Ejecuta el siguiente comando para autorizar Firebase CLI:

firebase login

Asegúrate de estar en el directorio cloud-functions-start y, luego, configura Firebase CLI para usar tu proyecto de Firebase:

firebase use --add

Luego, selecciona el ID del proyecto y sigue las instrucciones. Cuando se te solicite, puedes elegir cualquier alias, como codelab.

5. Implemente y ejecute la aplicación web

Ahora que importaste y configuraste tu proyecto, tienes todo listo para ejecutar la app web por primera vez. Abre una ventana de la terminal, navega a la carpeta cloud-functions-start y, luego, implementa la aplicación web en Firebase Hosting con el siguiente comando:

firebase deploy --except functions

Este es el resultado que debería ver en la consola:

i deploying database, storage, hosting
✔  database: rules ready to deploy.
i  storage: checking rules for compilation errors...
✔  storage: rules file compiled successfully
i  hosting: preparing ./ directory for upload...
✔  hosting: ./ folder uploaded successfully
✔ storage: rules file compiled successfully
✔ hosting: 8 files uploaded successfully
i starting release process (may take several minutes)...

✔ Deploy complete!

Project Console: https://console.firebase.google.com/project/friendlychat-1234/overview
Hosting URL: https://friendlychat-1234.firebaseapp.com

Abre la app web

La última línea debe mostrar la URL de Hosting. La app web debería publicarse desde esa URL, que debe tener el formato https://<ID-del-proyecto>.firebaseapp.com. Ábrelo. Deberías ver la IU en funcionamiento de una app de chat.

Usa el botón ACCEDER CON GOOGLE para acceder a la app y puedes agregar algunos mensajes y publicar imágenes:

3b1284f5144b54f6.png

Si accedes a la app por primera vez en un navegador nuevo, asegúrate de permitir las notificaciones cuando se te solicite: 8b9d0c66dc36153d.png

Habilitaremos las notificaciones más adelante.

Si hiciste clic por error en Bloquear, puedes cambiar esta configuración haciendo clic en el botón 🔒 Seguro a la izquierda de la URL en la barra multifunción de Chrome y activando la barra junto a Notificaciones:

e926868b0546ed71.png

Ahora, agregaremos algunas funcionalidades con el SDK de Firebase para Cloud Functions.

6. El directorio de Functions

Cloud Functions te permite ejecutar fácilmente código que se ejecuta en la nube sin tener que configurar un servidor. Veremos cómo compilar funciones que reaccionen a eventos de bases de datos de Firebase Auth, Cloud Storage y Firebase Firestore. Comencemos con Auth.

Cuando uses el SDK de Firebase para Cloud Functions, el código de Functions residirá en el directorio functions (de forma predeterminada). Tu código de Functions también es una app de Node.js y, por lo tanto, necesita un package.json que proporcione información sobre la app y enumere las dependencias.

Para facilitarte la tarea, ya creamos el archivo functions/index.js, en el que irás tu código. Puedes revisar este archivo antes de continuar.

cd functions
ls

Si no estás familiarizado con Node.js, sería útil obtener más información al respecto antes de continuar con el codelab.

El archivo package.json ya enumera dos dependencias obligatorias: el SDK de Firebase para Cloud Functions y el SDK de Firebase Admin. Para instalarlos de forma local, ve a la carpeta functions y ejecuta lo siguiente:

npm install

Ahora, veamos el archivo index.js:

index.js

/**
 * Copyright 2017 Google Inc. All Rights Reserved.
 * ...
 */

// TODO(DEVELOPER): Import the Cloud Functions for Firebase and the Firebase Admin modules here.

// TODO(DEVELOPER): Write the addWelcomeMessage Function here.

// TODO(DEVELOPER): Write the blurImages Function here.

// TODO(DEVELOPER): Write the sendNotification Function here.

Importaremos los módulos requeridos y, luego, escribiremos tres Functions en lugar de los TODO. Comencemos con la importación de los módulos de nodos requeridos.

7. Importe los módulos de Cloud Functions y Firebase Admin

Se requerirán dos módulos durante este codelab: firebase-functions permite escribir activadores y registros de Cloud Functions, mientras que firebase-admin habilita el uso de la plataforma de Firebase en un servidor con acceso de administrador para realizar acciones como escribir en Cloud Firestore o enviar notificaciones de FCM.

En el archivo index.js, reemplaza el primer TODO por lo siguiente:

index.js

/**
 * Copyright 2017 Google Inc. All Rights Reserved.
 * ...
 */

// Import the Firebase SDK for Google Cloud Functions.
const functions = require('firebase-functions');
// Import and initialize the Firebase Admin SDK.
const admin = require('firebase-admin');
admin.initializeApp();

// TODO(DEVELOPER): Write the addWelcomeMessage Function here.

// TODO(DEVELOPER): Write the blurImages Function here.

// TODO(DEVELOPER): Write the sendNotification Function here.

El SDK de Firebase Admin se puede configurar automáticamente cuando se implementa en un entorno de Cloud Functions o en otros contenedores de Google Cloud Platform. Esto sucede cuando llamamos a admin.initializeApp() sin argumentos.

Ahora, agregaremos una función que se ejecute cuando un usuario acceda por primera vez en la app de chat y agregaremos un mensaje de chat para darle la bienvenida al usuario.

8. Deles la bienvenida a los usuarios nuevos

Estructura de los mensajes de chat

Los mensajes publicados en el feed de Friendly Chat se almacenan en Cloud Firestore. Veamos la estructura de datos que usamos para un mensaje. Para ello, publica un mensaje nuevo en el chat que diga “Hello World”:

11f5a676fbb1a69a.png

Debería aparecer de esta manera:

fe6d1c020d0744cf.png

En Firebase console, haz clic en Base de datos de Firestore en la sección Compilación. Deberías ver la colección de mensajes y un documento que contiene el mensaje que escribiste:

442c9c10b5e2b245.png

Como puedes ver, los mensajes de chat se almacenan en Cloud Firestore como un documento con los atributos name, profilePicUrl, text y timestamp agregados a la colección messages.

Agrega mensajes de bienvenida

La primera Cloud Function agrega un mensaje que les da la bienvenida al chat a usuarios nuevos. Para ello, podemos usar el activador functions.auth().onCreate, que ejecuta la función cada vez que un usuario accede por primera vez a la app de Firebase. Agrega la función addWelcomeMessages a tu archivo index.js:

index.js

// Adds a message that welcomes new users into the chat.
exports.addWelcomeMessages = functions.auth.user().onCreate(async (user) => {
  functions.logger.log('A new user signed in for the first time.');
  const fullName = user.displayName || 'Anonymous';

  // Saves the new welcome message into the database
  // which then displays it in the FriendlyChat clients.
  await admin.firestore().collection('messages').add({
    name: 'Firebase Bot',
    profilePicUrl: '/images/firebase-logo.png', // Firebase logo
    text: `${fullName} signed in for the first time! Welcome!`,
    timestamp: admin.firestore.FieldValue.serverTimestamp(),
  });
  functions.logger.log('Welcome message written to database.');
});

Agregar esta función al objeto exports especial es la forma en que Node hace que se pueda acceder a la función fuera del archivo actual y es necesaria para Cloud Functions.

En la función anterior, agregamos un nuevo mensaje de bienvenida publicado por “Firebase Bot” a la lista de mensajes de chat. Para ello, usamos el método add en la colección messages de Cloud Firestore, que es donde se almacenan los mensajes del chat.

Dado que esta es una operación asíncrona, debemos mostrar la Promise, que indica cuándo Cloud Firestore terminó de escribir para que Cloud Functions no se ejecute demasiado pronto.

Implementa Cloud Functions con los siguientes comandos:

Cloud Functions solo estará activo después de que las implementes. Para ello, ejecuta el comando siguiente en la línea de comandos:

firebase deploy --only functions

Este es el resultado que debería ver en la consola:

i  deploying functions
i  functions: ensuring necessary APIs are enabled...
⚠  functions: missing necessary APIs. Enabling now...
i  env: ensuring necessary APIs are enabled...
⚠  env: missing necessary APIs. Enabling now...
i  functions: waiting for APIs to activate...
i  env: waiting for APIs to activate...
✔  env: all necessary APIs are enabled
✔  functions: all necessary APIs are enabled
i  functions: preparing functions directory for uploading...
i  functions: packaged functions (X.XX KB) for uploading
✔  functions: functions folder uploaded successfully
i  starting release process (may take several minutes)...
i  functions: creating function addWelcomeMessages...
✔  functions[addWelcomeMessages]: Successful create operation. 
✔  functions: all functions deployed successfully!

✔  Deploy complete!

Project Console: https://console.firebase.google.com/project/friendlypchat-1234/overview

Prueba la función

Una vez que se haya implementado correctamente la función, necesitarás un usuario que acceda por primera vez.

  1. Abre la app en el navegador con la URL de hosting (con formato de https://<project-id>.firebaseapp.com).
  2. Con un usuario nuevo, accede por primera vez en tu app a través del botón Acceder.

262535d1b1223c65.png

  1. Después de acceder, debería aparecer automáticamente un mensaje de bienvenida:

1c70e0d64b23525b.png

9. Moderación de imágenes

Los usuarios pueden subir todo tipo de imágenes al chat, y siempre es importante moderar las imágenes ofensivas, especialmente en las plataformas sociales públicas. En FriendlyChat, las imágenes que se publican en el chat se almacenan en Google Cloud Storage.

Con Cloud Functions, puedes detectar nuevas cargas de imágenes con el activador functions.storage().onFinalize. Este activador se ejecutará cada vez que se suba un archivo nuevo a Cloud Storage o se modifique.

Para moderar las imágenes, realizaremos el siguiente proceso:

  1. Utilice la API de Cloud Vision a fin de comprobar si la imagen se marcó como contenido violento o para adultos.
  2. Si la imagen se marcó, descárgala en la instancia de Functions en ejecución.
  3. Use ImageMagick para desenfocar la imagen.
  4. Suba la imagen desenfocada a Cloud Storage.

Habilite la API de Cloud Vision

Debido a que usaremos la API de Google Cloud Vision en esta función, debes habilitar la API en tu proyecto de Firebase. Sigue este vínculo. Luego, selecciona tu proyecto de Firebase y habilita la API:

5c77fee51ec5de49.png

Cómo instalar dependencias

A fin de moderar las imágenes, usaremos la biblioteca cliente de Google Cloud Vision para Node.js, @google-cloud/vision, a fin de ejecutar imágenes a través de la API de Cloud Vision y detectar imágenes inapropiadas.

Para instalar este paquete en tu app de Cloud Functions, ejecuta el siguiente comando npm install --save. Asegúrate de hacerlo desde el directorio functions.

npm install --save @google-cloud/vision@2.4.0

De esta manera, se instalará el paquete de forma local y los agregará como una dependencia declarada en tu archivo package.json.

Importa y configura dependencias

Para importar las dependencias que se instalaron y algunos módulos principales de Node.js (path, os y fs) que necesitaremos en esta sección, agrega las siguientes líneas a la parte superior de tu archivo index.js:

index.js

const Vision = require('@google-cloud/vision');
const vision = new Vision.ImageAnnotatorClient();
const {promisify} = require('util');
const exec = promisify(require('child_process').exec);

const path = require('path');
const os = require('os');
const fs = require('fs');

Dado que tu función se ejecutará en un entorno de Google Cloud, no es necesario configurar las bibliotecas de Cloud Storage y Cloud Vision: se configurarán automáticamente para usar tu proyecto.

Cómo detectar imágenes inapropiadas

Usarás el activador functions.storage.onChange de Cloud Functions, que ejecuta tu código no bien se crea o modifica un archivo o una carpeta en un bucket de Cloud Storage. Agrega la función blurOffensiveImages al archivo index.js:

index.js

// Checks if uploaded images are flagged as Adult or Violence and if so blurs them.
exports.blurOffensiveImages = functions.runWith({memory: '2GB'}).storage.object().onFinalize(
    async (object) => {
      const imageUri = `gs://${object.bucket}/${object.name}`;
      // Check the image content using the Cloud Vision API.
      const batchAnnotateImagesResponse = await vision.safeSearchDetection(imageUri);
      const safeSearchResult = batchAnnotateImagesResponse[0].safeSearchAnnotation;
      const Likelihood = Vision.protos.google.cloud.vision.v1.Likelihood;
      if (Likelihood[safeSearchResult.adult] >= Likelihood.LIKELY ||
          Likelihood[safeSearchResult.violence] >= Likelihood.LIKELY) {
        functions.logger.log('The image', object.name, 'has been detected as inappropriate.');
        return blurImage(object.name);
      }
      functions.logger.log('The image', object.name, 'has been detected as OK.');
    });

Ten en cuenta que agregamos algunos parámetros de configuración de la instancia de Cloud Functions que ejecutarán la función. Con .runWith({memory: '2GB'}), solicitamos que la instancia obtenga 2 GB de memoria en lugar de los predeterminados, ya que esta función requiere mucha memoria.

Cuando se activa la función, la imagen se ejecuta a través de la API de Cloud Vision para detectar si está marcada como contenido violento o para adultos. Si se detecta que la imagen es inapropiada según estos criterios, la desenfocaremos mediante la función blurImage, como veremos a continuación.

Cómo desenfocar la imagen

Agrega la siguiente función blurImage al archivo index.js:

index.js

// Blurs the given image located in the given bucket using ImageMagick.
async function blurImage(filePath) {
  const tempLocalFile = path.join(os.tmpdir(), path.basename(filePath));
  const messageId = filePath.split(path.sep)[1];
  const bucket = admin.storage().bucket();

  // Download file from bucket.
  await bucket.file(filePath).download({destination: tempLocalFile});
  functions.logger.log('Image has been downloaded to', tempLocalFile);
  // Blur the image using ImageMagick.
  await exec(`convert "${tempLocalFile}" -channel RGBA -blur 0x24 "${tempLocalFile}"`);
  functions.logger.log('Image has been blurred');
  // Uploading the Blurred image back into the bucket.
  await bucket.upload(tempLocalFile, {destination: filePath});
  functions.logger.log('Blurred image has been uploaded to', filePath);
  // Deleting the local file to free up disk space.
  fs.unlinkSync(tempLocalFile);
  functions.logger.log('Deleted local file.');
  // Indicate that the message has been moderated.
  await admin.firestore().collection('messages').doc(messageId).update({moderated: true});
  functions.logger.log('Marked the image as moderated in the database.');
}

En la función anterior, el objeto binario de la imagen se descarga desde Cloud Storage. Luego, la imagen se desenfoca con la herramienta convert de ImageMagick, y la versión desenfocada se vuelve a subir al bucket de Storage. A continuación, borramos el archivo de la instancia de Cloud Functions para liberar espacio en disco. Esto se debe a que la misma instancia de Cloud Functions se puede volver a usar y, si no se limpian los archivos, se podría quedar sin espacio en el disco. Por último, agregamos un valor booleano al mensaje de chat, que indica que se moderó la imagen. Esto activará una actualización del mensaje en el cliente.

Implementa la función

La función solo estará activa después de que la implementes. En la línea de comandos, ejecuta firebase deploy --only functions:

firebase deploy --only functions

Este es el resultado que debería ver en la consola:

i  deploying functions
i  functions: ensuring necessary APIs are enabled...
✔  functions: all necessary APIs are enabled
i  functions: preparing functions directory for uploading...
i  functions: packaged functions (X.XX KB) for uploading
✔  functions: functions folder uploaded successfully
i  starting release process (may take several minutes)...
i  functions: updating function addWelcomeMessages...
i  functions: creating function blurOffensiveImages...
✔  functions[addWelcomeMessages]: Successful update operation.
✔  functions[blurOffensiveImages]: Successful create operation.
✔  functions: all functions deployed successfully!

✔  Deploy complete!

Project Console: https://console.firebase.google.com/project/friendlychat-1234/overview

Prueba la función

Cuando la función se haya implementado correctamente, siga estos pasos:

  1. Abre la app en el navegador con la URL de hosting (con formato de https://<project-id>.firebaseapp.com).
  2. Una vez que hayas accedido a la app, sube una imagen: 4db9fdab56703e4a.png
  3. Elige la mejor imagen ofensiva para subirla (o usa la imagen de un zombi que come carne humana) y, después de unos momentos, deberías ver que tu publicación se actualiza con una versión desenfocada de la imagen: 83dd904fbaf97d2b.png

10. Notificaciones de mensajes nuevos

En esta sección, agregarás una Cloud Function que envíe notificaciones a los participantes del chat cuando se publique un mensaje nuevo.

Con Firebase Cloud Messaging (FCM), puedes enviar notificaciones a los usuarios de manera confiable en todas las plataformas. Para enviarle una notificación a un usuario, necesitas su token de dispositivo de FCM. La aplicación web de chat que usamos ya recopila tokens de dispositivo de los usuarios cuando abren la aplicación por primera vez en un navegador o dispositivo nuevo. Estos tokens se almacenan en Cloud Firestore, en la colección fcmTokens.

Si quieres aprender a obtener tokens de dispositivos de FCM en una app web, puedes realizar el Codelab sobre aplicaciones web de Firebase.

Cómo enviar notificaciones

Para detectar cuándo se publican mensajes nuevos, debes usar el activador functions.firestore.document().onCreate de Cloud Functions, que ejecuta tu código cuando se crea un objeto nuevo en una ruta de acceso específica de Cloud Firestore. Agrega la función sendNotifications al archivo index.js:

index.js

// Sends a notifications to all users when a new message is posted.
exports.sendNotifications = functions.firestore.document('messages/{messageId}').onCreate(
  async (snapshot) => {
    // Notification details.
    const text = snapshot.data().text;
    const payload = {
      notification: {
        title: `${snapshot.data().name} posted ${text ? 'a message' : 'an image'}`,
        body: text ? (text.length <= 100 ? text : text.substring(0, 97) + '...') : '',
        icon: snapshot.data().profilePicUrl || '/images/profile_placeholder.png',
        click_action: `https://${process.env.GCLOUD_PROJECT}.firebaseapp.com`,
      }
    };

    // Get the list of device tokens.
    const allTokens = await admin.firestore().collection('fcmTokens').get();
    const tokens = [];
    allTokens.forEach((tokenDoc) => {
      tokens.push(tokenDoc.id);
    });

    if (tokens.length > 0) {
      // Send notifications to all tokens.
      const response = await admin.messaging().sendToDevice(tokens, payload);
      await cleanupTokens(response, tokens);
      functions.logger.log('Notifications have been sent and tokens cleaned up.');
    }
  });

En la función anterior, recopilamos los tokens de dispositivo de todos los usuarios de la base de datos de Cloud Firestore y enviamos una notificación a cada uno de ellos con la función admin.messaging().sendToDevice.

Limpia los tokens

Por último, queremos quitar los tokens que ya no son válidos. Esto sucede cuando el navegador o el dispositivo ya no usan el token que una vez recibimos del usuario. Por ejemplo, esto sucede si el usuario revocó el permiso de notificaciones para la sesión del navegador. Para ello, agrega la siguiente función cleanupTokens en el archivo index.js:

index.js

// Cleans up the tokens that are no longer valid.
function cleanupTokens(response, tokens) {
 // For each notification we check if there was an error.
 const tokensDelete = [];
 response.results.forEach((result, index) => {
   const error = result.error;
   if (error) {
     functions.logger.error('Failure sending notification to', tokens[index], error);
     // Cleanup the tokens that are not registered anymore.
     if (error.code === 'messaging/invalid-registration-token' ||
         error.code === 'messaging/registration-token-not-registered') {
       const deleteTask = admin.firestore().collection('fcmTokens').doc(tokens[index]).delete();
       tokensDelete.push(deleteTask);
     }
   }
 });
 return Promise.all(tokensDelete);
}

Implementa la función

La función solo estará activa después de que la hayas implementado. Para implementarla, ejecuta el siguiente comando en la línea de comandos:

firebase deploy --only functions

Este es el resultado que debería ver en la consola:

i  deploying functions
i  functions: ensuring necessary APIs are enabled...
✔  functions: all necessary APIs are enabled
i  functions: preparing functions directory for uploading...
i  functions: packaged functions (X.XX KB) for uploading
✔  functions: functions folder uploaded successfully
i  starting release process (may take several minutes)...
i  functions: updating function addWelcomeMessages...
i  functions: updating function blurOffensiveImages...
i  functions: creating function sendNotifications...
✔  functions[addWelcomeMessages]: Successful update operation.
✔  functions[blurOffensiveImages]: Successful updating operation.
✔  functions[sendNotifications]: Successful create operation.
✔  functions: all functions deployed successfully!

✔  Deploy complete!

Project Console: https://console.firebase.google.com/project/friendlychat-1234/overview

Prueba la función

  1. Una vez que se haya implementado correctamente la función, abre la app en el navegador con la URL de hosting (en forma de https://<project-id>.firebaseapp.com).
  2. Si accedes a la app por primera vez, asegúrate de permitir las notificaciones cuando se te solicite: 8b9d0c66dc36153d.png
  3. Cierra la pestaña de la app de chat o muestra otra. Las notificaciones solo aparecen si la app está en segundo plano. Si deseas obtener información para recibir mensajes mientras la app está en primer plano, consulta nuestra documentación.
  4. Con otro navegador (o una ventana de incógnito), accede a la app y publica un mensaje. El primer navegador debería mostrar una notificación: 45282ab12b28b926.png

11. ¡Felicitaciones!

Utilizó el SDK de Firebase para Cloud Functions y agregó componentes del lado del servidor a una aplicación de chat.

Temas abordados

  • Cómo crear funciones de Cloud Functions con el SDK de Firebase para Cloud Functions
  • Cómo activar funciones de Cloud Functions basadas en eventos de Auth, Cloud Storage y Cloud Firestore
  • Cómo agregar compatibilidad con Firebase Cloud Messaging a su aplicación web
  • Implementar Cloud Functions con Firebase CLI

Próximos pasos

Más información