Entérate de todos los anuncios de Firebase Summit y descubre cómo Firebase puede ayudarte a acelerar el desarrollo de las apps y a ejecutarlas con confianza. Más información

Configurar una aplicación cliente de Firebase Cloud Messaging con Unity

Para escribir su aplicación cliente multiplataforma de Firebase Cloud Messaging con Unity, use la API de Firebase Cloud Messaging . El SDK de Unity funciona tanto para Android como para Apple, y se requiere alguna configuración adicional para cada plataforma.

Antes de que empieces

requisitos previos

  • Instale Unity 2019.1 o posterior. Las versiones anteriores también pueden ser compatibles, pero no se admitirán activamente. La compatibilidad con Unity 2019.1 se considera obsoleta y ya no se admitirá activamente después de la próxima versión principal.

  • (Solo iOS) Instale lo siguiente:

    • Xcode 13.3.1 o superior
    • CocoaPods 1.10.0 o superior
  • Asegúrate de que tu proyecto de Unity cumpla con estos requisitos:

    • Para iOS : apunta a iOS 11 o superior
    • Para Android : apunta al nivel de API 19 (KitKat) o superior
  • Configura un dispositivo o usa un emulador para ejecutar tu proyecto de Unity.

    • Para iOS : configure un dispositivo iOS físico para ejecutar su aplicación y complete estas tareas:

      • Obtenga una clave de autenticación de notificación push de Apple para su cuenta de desarrollador de Apple .
      • Habilite las notificaciones automáticas en XCode en Aplicación > Capacidades .
    • Para Android : los emuladores deben usar una imagen de emulador con Google Play.

Si aún no tiene un proyecto de Unity y solo desea probar un producto de Firebase, puede descargar uno de nuestros ejemplos de inicio rápido .

Paso 1: crea un proyecto de Firebase

Antes de poder agregar Firebase a su proyecto de Unity, debe crear un proyecto de Firebase para conectarse a su proyecto de Unity. Visite Comprender los proyectos de Firebase para obtener más información sobre los proyectos de Firebase.

Paso 2: Registre su aplicación con Firebase

Puede registrar una o más aplicaciones o juegos para conectarse con su proyecto de Firebase.

  1. Ve a la consola de Firebase .

  2. En el centro de la página de descripción general del proyecto, haga clic en el ícono de Unity ( ) para iniciar el flujo de trabajo de configuración.

    Si ya agregó una aplicación a su proyecto de Firebase, haga clic en Agregar aplicación para mostrar las opciones de la plataforma.

  3. Seleccione el objetivo de compilación de su proyecto de Unity que le gustaría registrar, o incluso puede seleccionar registrar ambos objetivos ahora al mismo tiempo.

  4. Ingresa los ID específicos de la plataforma de tu proyecto de Unity.

    • Para iOS : ingresa el ID de iOS de tu proyecto de Unity en el campo de ID del paquete de iOS.

    • Para Android : ingrese el ID de Android de su proyecto de Unity en el campo de nombre del paquete de Android.
      Los términos nombre del paquete e ID de la aplicación a menudo se usan indistintamente.

  5. (Opcional) Ingresa los apodos específicos de la plataforma de tu proyecto de Unity.
    Estos apodos son identificadores de conveniencia internos y solo son visibles para usted en la consola de Firebase.

  6. Haga clic en Registrar aplicación .

Paso 3: Agregar archivos de configuración de Firebase

  1. Obtenga los archivos de configuración de Firebase específicos de su plataforma en el flujo de trabajo de configuración de la consola de Firebase.

    • Para iOS : haga clic en Descargar GoogleService-Info.plist .

    • Para Android : haga clic en Descargar google-services.json .

  2. Abra la ventana Proyecto de su proyecto de Unity, luego mueva sus archivos de configuración a la carpeta Assets .

  3. De vuelta en Firebase console, en el flujo de trabajo de configuración, haga clic en Siguiente .

Paso 4: Agregar SDK de Firebase Unity

  1. En Firebase console, haga clic en Descargar Firebase Unity SDK y luego descomprima el SDK en algún lugar conveniente.

    • Puede volver a descargar el SDK de Firebase Unity en cualquier momento.

    • El SDK de Firebase Unity no es específico de la plataforma.

  2. En su proyecto de Unity abierto, vaya a Activos > Importar paquete > Paquete personalizado .

  3. Desde el SDK descomprimido, seleccione los productos compatibles de Firebase que desea usar en su aplicación.

    Para una experiencia óptima con Firebase Cloud Messaging, recomendamos habilitar Google Analytics en su proyecto. Además, como parte de la configuración de Analytics, debe agregar el paquete Firebase para Analytics a su aplicación.

    Análisis habilitado

    • Agregue el paquete de Firebase para Google Analytics: FirebaseAnalytics.unitypackage
    • Agregue el paquete para Firebase Cloud Messaging: FirebaseMessaging.unitypackage

    Análisis no habilitado

    Agregue el paquete para Firebase Cloud Messaging: FirebaseMessaging.unitypackage

  4. En la ventana Importar paquete de Unity , haga clic en Importar .

  5. De vuelta en Firebase console, en el flujo de trabajo de configuración, haga clic en Siguiente .

Paso 5: Confirme los requisitos de versión de los servicios de Google Play

El SDK de Firebase Unity para Android requiere los servicios de Google Play , que deben estar actualizados antes de que se pueda usar el SDK.

Agregue el siguiente código al comienzo de su aplicación. Puede verificar y, opcionalmente, actualizar los servicios de Google Play a la versión que requiere el SDK de Firebase Unity antes de llamar a cualquier otro método en el SDK.

Firebase.FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task => {
  var dependencyStatus = task.Result;
  if (dependencyStatus == Firebase.DependencyStatus.Available) {
    // Create and hold a reference to your FirebaseApp,
    // where app is a Firebase.FirebaseApp property of your application class.
       app = Firebase.FirebaseApp.DefaultInstance;

    // Set a flag here to indicate whether Firebase is ready to use by your app.
  } else {
    UnityEngine.Debug.LogError(System.String.Format(
      "Could not resolve all Firebase dependencies: {0}", dependencyStatus));
    // Firebase Unity SDK is not safe to use here.
  }
});

Tu proyecto de Unity está registrado y configurado para usar Firebase.

Paso 7: agregue el marco de notificaciones de usuario

  1. Haga clic en el proyecto en Xcode, luego seleccione la pestaña General en el área del Editor .

  2. Desplácese hacia abajo hasta Marcos y bibliotecas vinculados , luego haga clic en el botón + para agregar un marco.

  3. En la ventana que aparece, desplácese hasta UserNotifications.framework , haga clic en esa entrada y luego haga clic en Agregar .

Paso 8: habilite las notificaciones automáticas

  1. Haga clic en el proyecto en Xcode, luego seleccione la pestaña Capacidades en el área del Editor .

  2. Cambie Notificaciones automáticas a Activado .

  3. Desplácese hacia abajo hasta Modos de fondo , luego cámbielo a Activado .

  4. Seleccione la casilla de verificación Notificaciones remotas en Modos de fondo .

Inicializa Firebase Cloud Messaging

La biblioteca Firebase Cloud Message se inicializará al agregar controladores para los eventos TokenReceived o MessageReceived .

Tras la inicialización, se solicita un token de registro para la instancia de la aplicación cliente. La aplicación recibirá el token con el evento OnTokenReceived , que debe almacenarse en caché para su uso posterior. Necesitará este token si desea orientar mensajes a este dispositivo específico.

Además, deberá registrarse para el evento OnMessageReceived si desea poder recibir mensajes entrantes.

Toda la configuración se ve así:

public void Start() {
  Firebase.Messaging.FirebaseMessaging.TokenReceived += OnTokenReceived;
  Firebase.Messaging.FirebaseMessaging.MessageReceived += OnMessageReceived;
}

public void OnTokenReceived(object sender, Firebase.Messaging.TokenReceivedEventArgs token) {
  UnityEngine.Debug.Log("Received Registration Token: " + token.Token);
}

public void OnMessageReceived(object sender, Firebase.Messaging.MessageReceivedEventArgs e) {
  UnityEngine.Debug.Log("Received a new message from: " + e.Message.From);
}

Configuración de una actividad de punto de entrada de Android

En Android, Firebase Cloud Messaging viene con una actividad de punto de entrada personalizada que reemplaza la UnityPlayerActivity predeterminada. Si no está utilizando un punto de entrada personalizado, este reemplazo se realiza automáticamente y no debería tener que realizar ninguna acción adicional. Las aplicaciones que no utilicen la Actividad de punto de entrada predeterminada o que proporcionen sus propios Assets/Plugins/AndroidManifest.xml necesitarán una configuración adicional.

El complemento Firebase Cloud Messaging Unity para Android incluye dos archivos adicionales:

  • Assets/Plugins/Android/libmessaging_unity_player_activity.jar contiene una actividad denominada MessagingUnityPlayerActivity que reemplaza a la UnityPlayerActivity estándar.
  • Assets/Plugins/Android/AndroidManifest.xml indica a la aplicación que use MessagingUnityPlayerActivity como punto de entrada a la aplicación.

Estos archivos se proporcionan porque el UnityPlayerActivity predeterminado no maneja las transiciones del ciclo de vida de la actividad onStop , onRestart ni implementa onNewIntent que es necesario para que Firebase Cloud Messaging maneje correctamente los mensajes entrantes.

Configuración de una actividad de punto de entrada personalizado

Si su aplicación no usa el UnityPlayerActivity predeterminado, deberá eliminar el AndroidManifest.xml proporcionado y asegurarse de que su actividad personalizada maneje correctamente todas las transiciones del ciclo de vida de la actividad de Android (a continuación se muestra un ejemplo de cómo hacerlo). Si su actividad personalizada amplía UnityPlayerActivity , puede ampliar com.google.firebase.MessagingUnityPlayerActivity , que implementa todos los métodos necesarios.

Si usa una actividad personalizada y no amplía com.google.firebase.MessagingUnityPlayerActivity , debe incluir los siguientes fragmentos en su actividad.

/**
 * Workaround for when a message is sent containing both a Data and Notification payload.
 *
 * When the app is in the background, if a message with both a data and notification payload is
 * received the data payload is stored on the Intent passed to onNewIntent. By default, that
 * intent does not get set as the Intent that started the app, so when the app comes back online
 * it doesn't see a new FCM message to respond to. As a workaround, we override onNewIntent so
 * that it sends the intent to the MessageForwardingService which forwards the message to the
 * FirebaseMessagingService which in turn sends the message to the application.
 */
@Override
protected void onNewIntent(Intent intent) {
  Intent message = new Intent(this, MessageForwardingService.class);
  message.setAction(MessageForwardingService.ACTION_REMOTE_INTENT);
  message.putExtras(intent);
  message.setData(intent.getData());
  // For older versions of Firebase C++ SDK (< 7.1.0), use `startService`.
  // startService(message);
  MessageForwardingService.enqueueWork(this, message);
}

/**
 * Dispose of the mUnityPlayer when restarting the app.
 *
 * This ensures that when the app starts up again it does not start with stale data.
 */
@Override
protected void onCreate(Bundle savedInstanceState) {
  if (mUnityPlayer != null) {
    mUnityPlayer.quit();
    mUnityPlayer = null;
  }
  super.onCreate(savedInstanceState);
}

Las nuevas versiones de Firebase C++ SDK (7.1.0 en adelante) usan JobIntentService , que requiere modificaciones adicionales en el archivo AndroidManifest.xml .

<service android:name="com.google.firebase.messaging.MessageForwardingService"
     android:permission="android.permission.BIND_JOB_SERVICE"
     android:exported="false" >
</service>

Nota sobre la entrega de mensajes en Android

Cuando la aplicación no se está ejecutando en absoluto y un usuario toca una notificación, el mensaje no se enruta, de forma predeterminada, a través de las devoluciones de llamada integradas de FCM. En este caso, las cargas de mensajes se reciben a través de un Intent que se usa para iniciar la aplicación.

Los mensajes recibidos mientras la aplicación está en segundo plano tienen el contenido de su campo de notificación utilizado para completar la notificación de la bandeja del sistema, pero ese contenido de la notificación no se comunicará a FCM. Es decir, FirebaseMessage.Notification será nulo.

En resumen:

estado de la aplicación Notificación Datos Ambas cosas
Primer plano Firebase.Messaging.FirebaseMessaging.MessageReceived Firebase.Messaging.FirebaseMessaging.MessageReceived Firebase.Messaging.FirebaseMessaging.MessageReceived
Fondo Bandeja del sistema Firebase.Messaging.FirebaseMessaging.MessageReceived Notificación: bandeja del sistema
Datos: en extras de la intención.

Evitar la inicialización automática

FCM genera un token de registro para la orientación de dispositivos. Cuando se genera un token, la biblioteca carga el identificador y los datos de configuración en Firebase. Si desea obtener una suscripción explícita antes de usar el token, puede evitar la generación en el momento de la configuración al deshabilitar FCM (y en Android, Analytics). Para hacer esto, agregue un valor de metadatos a su Info.plist (no a su GoogleService-Info.plist ) en Apple o a su AndroidManifest.xml en Android:

Androide

<?xml version="1.0" encoding="utf-8"?>
<application>
  <meta-data android:name="firebase_messaging_auto_init_enabled"
             android:value="false" />
  <meta-data android:name="firebase_analytics_collection_enabled"
             android:value="false" />
</application>

Rápido

FirebaseMessagingAutoInitEnabled = NO

Para volver a habilitar FCM, puede realizar una llamada en tiempo de ejecución:

Firebase.Messaging.FirebaseMessaging.TokenRegistrationOnInitEnabled = true;

Este valor persiste a través de los reinicios de la aplicación una vez establecido.

FCM permite enviar mensajes que contienen un enlace profundo a su aplicación. Para recibir mensajes que contienen un enlace profundo, debe agregar un nuevo filtro de intención a la actividad que maneja los enlaces profundos para su aplicación. El filtro de intención debe capturar enlaces profundos de su dominio. Si sus mensajes no contienen un enlace profundo, esta configuración no es necesaria. En AndroidManifest.xml:

<intent-filter>
  <action android:name="android.intent.action.VIEW"/>
  <category android:name="android.intent.category.DEFAULT"/>
  <category android:name="android.intent.category.BROWSABLE"/>
  <data android:host="CHANGE_THIS_DOMAIN.example.com" android:scheme="http"/>
  <data android:host="CHANGE_THIS_DOMAIN.example.com" android:scheme="https"/>
</intent-filter>

También es posible especificar un comodín para que el filtro de intenciones sea más flexible. Por ejemplo:

<intent-filter>
  <action android:name="android.intent.action.VIEW"/>
  <category android:name="android.intent.category.DEFAULT"/>
  <category android:name="android.intent.category.BROWSABLE"/>
  <data android:host="*.example.com" android:scheme="http"/>
  <data android:host="*.example.com" android:scheme="https"/>
</intent-filter>

Cuando los usuarios tocan una notificación que contiene un enlace al esquema y al host que especifique, su aplicación iniciará la actividad con este filtro de intención para manejar el enlace.

Próximos pasos

Después de configurar la aplicación cliente, está listo para enviar mensajes descendentes y temáticos con Firebase. Para obtener más información, consulte el ejemplo de inicio rápido que demuestra esta funcionalidad.

Para agregar otro comportamiento más avanzado a su aplicación, consulte las guías para enviar mensajes desde un servidor de aplicaciones:

Tenga en cuenta que necesitará una implementación de servidor para hacer uso de estas funciones.