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 C++

Organiza tus páginas con colecciones Guarda y categoriza el contenido según tus preferencias.

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

Configurar Firebase y el SDK de FCM

Androide

  1. Si aún no lo ha hecho, agregue Firebase a su proyecto de C++ .

    • En las instrucciones de configuración vinculadas, revise los requisitos del dispositivo y la aplicación para usar el SDK de Firebase C++, incluida la recomendación de usar CMake para compilar su aplicación.

    • En su archivo build.gradle a nivel de proyecto, asegúrese de incluir el repositorio Maven de Google en las secciones de buildscript y allprojects .

  2. Cree un objeto de aplicación Firebase, pasando el entorno JNI y la actividad:

    app = ::firebase::App::Create(::firebase::AppOptions(), jni_env, activity);

  3. Define una clase que implemente la firebase::messaging::Listener .

  4. Inicialice FCM, pasando la aplicación y un oyente construido:

    ::firebase::messaging::Initialize(app, listener);

  5. Las aplicaciones que se basan en el SDK de servicios de Google Play deben verificar si el dispositivo tiene un APK de servicios de Google Play compatible antes de acceder a las funciones. Para obtener más información, consulte Comprobar la APK de los servicios de Google Play .

iOS+

  1. Necesita un certificado APNs válido. Si aún no tiene uno, asegúrese de crear uno en el Centro de miembros para desarrolladores de Apple .
  2. Si aún no lo ha hecho, agregue Firebase a su proyecto de C++ . Luego, para configurar su proyecto para FCM:
    1. En el Podfile de su proyecto, agregue la dependencia FCM:
      pod 'FirebaseMessaging'
    2. Arrastre los firebase.framework y firebase_messaging.framework a su proyecto Xcode desde el SDK de Firebase C++ .
  3. Configure su proyecto Xcode para habilitar las notificaciones automáticas:

    1. Seleccione el proyecto del área Navegador .
    2. Seleccione el destino del proyecto en el área del Editor .
    3. Seleccione la pestaña General del área Editor .

      1. Desplácese hacia abajo hasta Marcos y bibliotecas vinculados , luego haga clic en el botón + para agregar marcos.
      2. En la ventana que aparece, desplácese hasta UserNotifications.framework , haga clic en esa entrada y luego haga clic en Agregar .

        Este marco solo aparece en Xcode v8 y versiones posteriores y es requerido por esta biblioteca.

    4. Seleccione la pestaña Capacidades en el área del Editor .

      1. Cambie Notificaciones automáticas a Activado .
      2. Desplácese hacia abajo hasta Modos de fondo , luego cámbielo a Activado .
      3. Seleccione Notificaciones remotas en Modos de fondo .
  4. Cree un objeto de aplicación de Firebase:

    app = ::firebase::App::Create(::firebase::AppOptions());

  5. Define una clase que implemente la firebase::messaging::Listener .

  6. Inicialice Firebase Cloud Messaging, pasando la aplicación y un oyente construido:

    ::firebase::messaging::Initialize(app, listener);

Acceder al token de registro del dispositivo

Al inicializar la biblioteca de Firebase Cloud Messaging, se solicita un token de registro para la instancia de la aplicación cliente. La aplicación recibirá el token con la devolución de llamada OnTokenReceived , que debe definirse en la clase que implementa firebase::messaging::Listener .

Si desea apuntar a ese dispositivo específico, necesitará acceso a este token.

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. Para que FCM reenvíe estos mensajes entrantes a la devolución de llamada de la biblioteca de C++, debe anular el método onNewIntent en su actividad y pasar la Intent a MessageForwardingService .

import com.google.firebase.messaging.MessageForwardingService;

class MyActivity extends Activity {
  private static final String TAG = "MyActvity";

  @Override
  protected void onNewIntent(Intent intent) {
    Log.d(TAG, "A message was sent to this app while it was in the background.");
    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);
  }
}

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, Message::notification será nulo.

En resumen:

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

Manejo de mensajes personalizados en Android

De manera predeterminada, las notificaciones enviadas a la aplicación se pasan a ::firebase::messaging::Listener::OnMessageReceived , pero en algunos casos es posible que desee anular el comportamiento predeterminado. Para hacer esto en Android, deberá escribir clases personalizadas que amplíen com.google.firebase.messaging.cpp.ListenerService y actualizar el AndroidManifest.xml de su proyecto.

Anule los métodos de ListenerService .

ListenerService es la clase de Java que intercepta los mensajes entrantes enviados a la aplicación y los enruta a la biblioteca de C++. Cuando la aplicación está en primer plano (o cuando la aplicación está en segundo plano y recibe una carga útil de solo datos), los mensajes pasarán a través de una de las devoluciones de llamada proporcionadas en esta clase. Para agregar un comportamiento personalizado al manejo de mensajes, deberá extender el ListenerService predeterminado de FCM:

import com.google.firebase.messaging.cpp.ListenerService;

class MyListenerService extends ListenerService {

Al anular el método ListenerService.onMessageReceived , puede realizar acciones basadas en el objeto RemoteMessage recibido y obtener los datos del mensaje:

@Override
public void onMessageReceived(RemoteMessage message) {
  Log.d(TAG, "A message has been received.");
  // Do additional logic...
  super.onMessageReceived(message);
}

ListenerService también tiene algunos otros métodos que se usan con menos frecuencia. Estos también se pueden anular; para obtener más información, consulte la referencia de FirebaseMessagingService .

@Override
public void onDeletedMessages() {
  Log.d(TAG, "Messages have been deleted on the server.");
  // Do additional logic...
  super.onDeletedMessages();
}

@Override
public void onMessageSent(String messageId) {
  Log.d(TAG, "An outgoing message has been sent.");
  // Do additional logic...
  super.onMessageSent(messageId);
}

@Override
public void onSendError(String messageId, Exception exception) {
  Log.d(TAG, "An outgoing message encountered an error.");
  // Do additional logic...
  super.onSendError(messageId, exception);
}

Actualizar AndroidManifest.xml

Una vez que se hayan escrito sus clases personalizadas, deben incluirse en AndroidManifest.xml para que surtan efecto. Asegúrese de que el manifiesto incluya las herramientas de combinación declarando el atributo apropiado dentro de la etiqueta <manifest> , así:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.google.firebase.messaging.cpp.samples"
    xmlns:tools="http://schemas.android.com/tools">

En el archivo firebase_messaging_cpp.aar hay un archivo AndroidManifest.xml que declara el ListenerService predeterminado de FCM. Este manifiesto normalmente se fusiona con el manifiesto específico del proyecto, que es cómo se puede ejecutar ListenerService . Este ListenerService debe reemplazarse con el servicio de escucha personalizado. Eso se logra eliminando el ListenerService predeterminado y agregando el servicio personalizado, lo que se puede hacer con las siguientes líneas en su archivo AndroidManifest.xml de proyectos:

<service android:name="com.google.firebase.messaging.cpp.ListenerService"
         tools:node="remove" />
<service android:name="com.google.firebase.messaging.cpp.samples.MyListenerService"
         android:exported="false">
  <intent-filter>
    <action android:name="com.google.firebase.MESSAGING_EVENT"/>
  </intent-filter>
</service>

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>

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 las plataformas de 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::SetTokenRegistrationOnInitEnabled(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, vea esta funcionalidad demostrada en la muestra de inicio rápido que puede descargar, ejecutar y revisar.

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.