Ir a la consola

Configura una app cliente de Firebase Cloud Messaging con Unity

Para escribir tu app cliente multiplataforma de Firebase Cloud Messaging con Unity, usa la API de Firebase Cloud Messaging. El SDK de Unity funciona tanto para Android como para iOS, con algunas configuraciones adicionales necesarias para cada plataforma.

Antes de comenzar

Paso 1: Configura tu entorno

  • Instala Unity 5.3 o una versión más reciente

  • (solo para iOS) Comprueba si tienes acceso a los siguientes recursos:

    • Xcode 9.4.1 o una versión más reciente
    • CocoaPods 1.4.0 o una versión más reciente
  • Asegúrate de que tu proyecto de Unity esté orientado al nivel de SO adecuado, según se indica a continuación:

    • iOS: orienta a iOS 8 o una versión más reciente.
    • Android: orienta al nivel de API 16 (Jelly Bean) o una versión más reciente.
  • Configura un dispositivo o emulador para ejecutar tu proyecto de Unity.

    • iOS: Para Firebase Cloud Messaging, necesitarás los siguientes elementos:

      • Un dispositivo iOS físico
      • Un certificado APNS con notificaciones push habilitadas
    • Android: Los emuladores deben usar una imagen con Google Play.

  • Accede a Firebase con tu Cuenta de Google.

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

Paso 2: Crea un proyecto de Firebase

Antes de que puedas agregar Firebase a tu proyecto de Unity, deberás crear un proyecto de Firebase para conectarlo con el de Unity. Consulta el artículo Información sobre los proyectos de Firebase para obtener detalles sobre el tema.

Paso 3: Registra tu proyecto de Unity con el de Firebase

Puedes registrar una o más apps o juegos para conectarlos con tu proyecto de Firebase.

  1. En el centro de la página de descripción general del proyecto de Firebase console, haz clic en el ícono de Unity para iniciar el flujo de trabajo de la configuración.

    Si ya agregaste una app a tu proyecto de Firebase, haz clic en Agregar app para que se muestren las opciones de la plataforma.

  2. Selecciona qué destino de compilación de tu proyecto de Unity quieres registrar, o si quieres registrar ambos destinos, este es el momento de hacerlo.

  3. Ingresa el ID del proyecto de Unity específico de cada plataforma.

    1. Abre el proyecto en el IDE de Unity.

    2. Navega hasta Build Settings > iOS o Android > Player Settings > Other Settings.

      El ID del proyecto de Unity es el valor del Bundle Identifier (ID de ejemplo: com.yourcompany.unity-project-name)

    3. Ingresa los ID específicos de las plataformas en los campos correspondientes:

      • iOS: Ingresa el ID del proyecto de Unity para iOS en el campo ID del paquete de iOS.

      • Android: Ingresa el ID del proyecto de Unity para Android en el campo Nombre del paquete de Android.

        • Normalmente, los términos ID de la aplicación y nombre del paquete se utilizan de manera intercambiable.
  4. (Opcional) Ingresa el sobrenombre específico de cada plataforma para tu proyecto de Unity.

    Los sobrenombres son identificadores internos y convenientes que solo tú puedes ver en Firebase console.

  5. Haz clic en Registrar app.

Paso 4: Agrega archivos de configuración de Firebase a tu proyecto de Unity

  1. Usa el flujo de trabajo de configuración de Firebase console para obtener los archivos de configuración de Firebase específicos de las plataformas.

  2. Abre la ventana Proyecto de tu proyecto de Unity y transfiere los archivos de configuración a la carpeta Assets.

    • Antes de transferir tu archivo de configuración, asegúrate de que no se adjunte con caracteres adicionales, como (2).
    • Puedes dejar los archivos de configuración de Firebase en cualquier lugar de la carpeta Assets.
  3. Vuelve a Firebase console y, en el flujo de trabajo de configuración, haz clic en Siguiente.

Paso 5: Agrega un SDK de Firebase a tu proyecto de Unity

  1. En Firebase console, haz clic en Descargar el SDK de Firebase Unity, y luego descomprímelo en el lugar que prefieras.

    • Puedes volver a descargar el SDK de Firebase Unity cuando quieras.

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

  2. Abre tu proyecto de Unity, ve a Elementos > Importar paquete > Paquete personalizado.

  3. En el SDK que descomprimiste, selecciona Importar el SDK de Firebase Cloud Messaging (FirebaseMessaging.unitypackage).

    También puedes importar cualquier otro producto de Firebase admitido.

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

  5. Vuelve a Firebase console y en el flujo de trabajo de configuración, haz clic en Siguiente.

Paso 6: Confirma los requisitos de la versión de Servicios de Google Play

El SDK de Firebase Unity en Android requiere los Servicios de Google Play actualizados para poder usarlo.

Se debe agregar el siguiente código al inicio de la aplicación. Puedes buscar los Servicios de Google Play y, de forma opcional, actualizarlos a la versión que requiera el SDK de Firebase Unity. De esta manera, es posible llamar a otros métodos 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.
  }
});

El proyecto de Unity se registró y configuró para usar Firebase.

Paso 7: Agrega el marco de trabajo de notificaciones de usuario

  1. Haz clic en el proyecto en Xcode y selecciona la pestaña General en el área del Editor.

  2. Desplázate hacia abajo hasta Bibliotecas y marcos de trabajo vinculados y selecciona el botón + para agregar un marco de trabajo.

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

Paso 8: Habilita las notificaciones push

  1. Haz clic en el proyecto en Xcode y selecciona la pestaña Funciones en el área del Editor.

  2. Activa Notificaciones push.

  3. Desplázate a Modos en segundo plano y activa esa opción.

  4. Selecciona la casilla de verificación Notificaciones remotas en Modos en segundo plano.

Inicializa Firebase Cloud Messaging

La biblioteca de Firebase Cloud Messaging se inicializará cuando agregues controladores para eventos TokenReceived o MessageReceived.

Tras la inicialización, se solicita un token de registro para la instancia de la app cliente. La app recibirá el token con el evento OnTokenReceived, que debe almacenarse en caché para usarse después. Necesitarás este token si quieres orientar mensajes a este dispositivo específico.

Además, tendrás que registrarte para el evento OnMessageReceived si deseas poder recibir mensajes entrantes.

La configuración completa tiene el siguiente aspecto:

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 la actividad de un punto de entrada de Android

En Android, Firebase Cloud Messaging incluye una actividad de punto de entrada personalizado que reemplaza la UnityPlayerActivity predeterminada. Si no usas un punto de entrada personalizado, este reemplazo se aplica de forma automática y no debes hacer nada más. Las apps que no usan la actividad de punto de entrada predeterminado o que admiten su propio Assets/Plugins/AndroidManifest.xml necesitarán una configuración adicional.

El complemento de Firebase Cloud Messaging para Unity en Android viene con dos archivos adicionales:

  • Assets/Plugins/Android/libmessaging_unity_player_activity.jar contiene una actividad llamada MessagingUnityPlayerActivity que reemplaza la estándar UnityPlayerActivity.
  • Assets/Plugins/Android/AndroidManifest.xml le indica a la app que use MessagingUnityPlayerActivity como punto de entrada para la app.

Estos archivos se incluyen porque la actividad predeterminada UnityPlayerActivity no maneja las transiciones del ciclo de vida de las actividades onStop y onRestart ni implementa onNewIntent, lo cual es necesario para que Firebase Cloud Messaging administre los mensajes entrantes correctamente.

Configuración de la actividad de un punto de entrada predeterminado

Si tu app no usa la actividad predeterminada UnityPlayerActivity, deberás quitar el archivo AndroidManifest.xml que se proporciona y asegurarte de que tu actividad personalizada maneje correctamente todas las transiciones del ciclo de vida de las actividades en Android (a continuación, se muestra un ejemplo de cómo hacerlo). Si tu actividad personalizada extiende UnityPlayerActivity, puedes extender com.google.firebase.MessagingUnityPlayerActivity en su lugar, ya que esta actividad implementa todos los métodos necesarios.

Si estás usando una actividad personalizada y no estás extendiendo com.google.firebase.MessagingUnityPlayerActivity, debes incluir los siguientes fragmentos en la 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
 * receieved 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());
  startService(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);
}

Nota sobre la entrega de mensajes en Android

Cuando la aplicación no se está ejecutando en absoluto y un usuario presiona una notificación, el mensaje no se envía, de manera predeterminada, a través de las devoluciones de llamada incorporadas en FCM. En este caso, las cargas útiles de los mensajes se reciben a través de un Intent que se utiliza para iniciar la aplicación.

Los mensajes que se reciben mientras la app se ejecuta en segundo plano incluyen el contenido del campo de notificación que se usó para propagar la información de la notificación de la bandeja del sistema. Sin embargo, no se comunicará el contenido de la notificación a FCM, es decir, FirebaseMessage.Notification tendrá el valor “null”.

Resumen:

Estado de la app Notificación Datos Ambos
Primer plano Firebase.Messaging.FirebaseMessaging.MessageReceived Firebase.Messaging.FirebaseMessaging.MessageReceived Firebase.Messaging.FirebaseMessaging.MessageReceived
Segundo plano Bandeja del sistema Firebase.Messaging.FirebaseMessaging.MessageReceived Notificación: Bandeja del sistema
Datos: en extras del intent

Evita la inicialización automática

FCM genera un ID de instancia, que se utiliza como token de registro dentro de FCM. Cuando se genera un ID de instancia, la biblioteca sube el identificador y los datos de configuración a Firebase.Si deseas obtener una habilitación explícita antes de usar un ID de instancia, puedes evitar que se genere en el momento de la configuración si inhabilitas FCM (y Analytics en Android). Para ello, agrega un valor de metadatos a Info.plist (no a GoogleService-Info.plist) en iOS o a AndroidManifest.xml en Android:

Android

<?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>

iOS

FirebaseMessagingAutoInitEnabled = NO

Para volver a habilitar FCM, realiza una llamada de tiempo de ejecución:

Firebase.Messaging.FirebaseMessaging.TokenRegistrationOnInitEnabled = true;

Este valor persiste en todos los reinicios de la aplicación una vez establecido.

FCM permite enviar mensajes que contengan un vínculo directo a una app. Para recibir mensajes que contengan un vínculo directo, debes agregar un filtro de intent nuevo a la actividad que administra los vínculos directos para tu app. El filtro de intent debe capturar vínculos directos del dominio. Si los mensajes no contienen un vínculo directo, 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 aumentar la flexibilidad del filtro de intent. 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 presionen una notificación con un vínculo directo al esquema y al host que especificaste, tu app iniciará la actividad con este filtro de intent para administrar el vínculo.

Próximos pasos

Después de configurar la app cliente, estás listo para enviar mensajes descendentes y a temas con Firebase. Para obtener más información, consulta la muestra de inicio rápido, que demuestra esta función.

Para agregar otro comportamiento más avanzado a tu app, consulta las guías para enviar mensajes desde un servidor de apps:

Recuerda que necesitarás una implementación de servidor para usar estas funciones.