Configurare un'app client Firebase Cloud Messaging con C++

Per scrivere l'app client Firebase Cloud Messaging multipiattaforma con C++, utilizza l'API Firebase Cloud Messaging. L'SDK C++ funziona sia per le piattaforme Android che per Apple, con alcune configurazioni aggiuntive necessarie per ciascuna piattaforma.

Configura Firebase e l'SDK FCM

Android

  1. Se non lo hai già fatto, aggiungi Firebase al tuo progetto C++.

    • Nelle istruzioni di configurazione collegate, esamina i requisiti di app e dispositivo per l'utilizzo dell'SDK Firebase C++, incluso il consiglio di utilizzare CMake per compilare l'app.

    • Nel file build.gradle a livello di progetto, assicurati di includere il Repository Maven di Google in entrambe le sezioni buildscript e allprojects.

  2. Crea un oggetto Firebase App, passando l'ambiente JNI e Activity:

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

  3. Definisci una classe che implementa l'interfaccia firebase::messaging::Listener.

  4. Inizializza FCM passando l'app e un Listener creato:

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

  5. Le app che si basano sull'SDK Google Play Services devono verificare sul dispositivo la presenza di un APK di Google Play Services compatibile prima di accedere alle funzionalità. Per scoprire di più, consulta la pagina Verificare la presenza di APK Google Play Services.

iOS+

  1. Se non l'hai già fatto, aggiungi Firebase al tuo progetto C++. Quindi, per configurare il progetto per FCM:
    1. Nel Podfile del progetto, aggiungi la dipendenza FCM:
      pod 'FirebaseMessaging'
    2. Trascina i framework firebase.framework e firebase_messaging.framework nel progetto Xcode dall'SDK Firebase C++.
  2. Carica la chiave di autenticazione del servizio APN su Firebase. Se non hai ancora una chiave di autenticazione APN, assicurati di crearne una nel Centro per gli sviluppatori Apple.

    1. All'interno del progetto nella console Firebase, seleziona l'icona a forma di ingranaggio, seleziona Impostazioni progetto e poi la scheda Cloud Messaging.

    2. In Chiave di autenticazione APN in Configurazione app per iOS, fai clic sul pulsante Carica.

    3. Vai alla posizione in cui hai salvato la chiave, selezionala e fai clic su Apri. Aggiungi l'ID della chiave (disponibile nell' Apple Developer Member Center) e fai clic su Carica.

  3. Configura il progetto Xcode per attivare le notifiche push:

    1. Seleziona il progetto dall'area del navigatore.
    2. Seleziona il target del progetto dall'area Editor.
    3. Seleziona la scheda Generali dall'area di modifica.

      1. Scorri verso il basso fino a Framework e librerie collegate e poi fai clic sul pulsante + per aggiungere framework.
      2. Nella finestra visualizzata, scorri fino a Usernotifications.framework, fai clic sulla voce e quindi su Aggiungi.

        Questo framework viene visualizzato solo in Xcode v8 e versioni successive ed è richiesto da questa libreria.

    4. Seleziona la scheda Funzionalità dall'area di modifica.

      1. Imposta Notifiche push su On.
      2. Scorri verso il basso fino a Modalità in background, quindi imposta l'opzione su On.
      3. Seleziona Notifiche remote in Modalità background.
  4. Crea un oggetto app Firebase:

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

  5. Definisci una classe che implementi l'interfaccia firebase::messaging::Listener.

  6. Inizializza Firebase Cloud Messaging passando l'app e un Listener creato:

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

Accedere al token di registrazione del dispositivo

All'inizializzazione della libreria Firebase Cloud Messaging, viene richiesto un token di registrazione per l'istanza dell'app client. L'app riceverà il token con il callback OnTokenReceived, che deve essere definito nella classe che implementa firebase::messaging::Listener.

Se vuoi scegliere come target quel dispositivo specifico, dovrai accedere a questo token.

Nota sulla consegna dei messaggi su Android

Quando l'app non è in esecuzione e un utente tocca una notifica, il messaggio non viene indirizzato per impostazione predefinita tramite i callback integrati di FCM. In questo caso, i payload dei messaggi vengono ricevuti tramite un Intent utilizzato per avviare l'applicazione. Per fare in modo che FCM inoltri questi messaggi in arrivo al callback della libreria C++, devi eseguire l'override del metodo onNewIntent nella tua Attività e passare Intent al 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);
  }
}

I messaggi ricevuti mentre l'app è in background mostrano i contenuti del campo di notifica utilizzato per compilare la notifica nella barra delle applicazioni, ma questo contenuto non verrà comunicato a FCM. Ciò significa che Message::notification sarà nullo.

In sintesi:

Stato dell'app Notifica Dati Entrambe
Primo piano OnMessageReceived OnMessageReceived OnMessageReceived
Contesto Barra delle applicazioni OnMessageReceived Notifica: barra delle applicazioni
Dati: extra dell'intent.

Gestione dei messaggi personalizzati su Android

Per impostazione predefinita, le notifiche inviate all'app vengono trasmesse a ::firebase::messaging::Listener::OnMessageReceived, ma in alcuni casi potresti voler sostituire il comportamento predefinito. Per farlo su Android, dovrai scrivere classi personalizzate che estendono com.google.firebase.messaging.cpp.ListenerService e aggiornare AndroidManifest.xml del progetto.

Sostituisci i metodi ListenerService.

ListenerService è la classe Java che intercetta i messaggi in arrivo inviati all'app e li instrada alla libreria C++. Quando l'app è in primo piano (o quando è in background e riceve un payload solo dati), i messaggi passeranno attraverso uno dei callback forniti in questa classe. Per aggiungere un comportamento personalizzato alla gestione dei messaggi, devi estendere ListenerService predefinito di FCM:

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

class MyListenerService extends ListenerService {

Se esegui l'override del metodo ListenerService.onMessageReceived, puoi eseguire azioni in base all'oggetto RemoteMessage ricevuto e recuperare i dati dei messaggi:

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

ListenerService offre anche alcuni altri metodi, che vengono utilizzati con minore frequenza. Anche questi possono essere sostituiti. Per ulteriori informazioni, consulta la documentazione di riferimento di 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);
}

Aggiorna AndroidManifest.xml

Una volta scritte, le classi personalizzate devono essere incluse in AndroidManifest.xml per diventare effettive. Assicurati che il manifest includa gli strumenti di unione dichiarando l'attributo appropriato all'interno del tag <manifest>, come segue:

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

Nell'archivio firebase_messaging_cpp.aar è presente un file AndroidManifest.xml che dichiara il ListenerService predefinito di FCM. Questo manifest solitamente viene unito al manifest specifico del progetto, in modo che ListenerService possa essere eseguito. Questo ListenerService deve essere sostituito con il servizio di ascoltatori personalizzati. Per farlo, rimuovi il ListenerService predefinito e aggiungi il servizio personalizzato, che puoi fare con le seguenti righe del file AndroidManifest.xml del progetto:

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

Le nuove versioni dell'SDK Firebase C++ (dalla 7.1.0 in poi) utilizzano JobIntentService, che richiede modifiche aggiuntive nel file AndroidManifest.xml.

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

Impedire l'inizializzazione automatica

FCM genera un token di registrazione per il targeting per dispositivo. Quando viene generato un token, la libreria carica su Firebase i dati di configurazione e l'identificatore. Se vuoi ottenere un'attivazione esplicita prima di utilizzare il token, puoi impedire la generazione in fase di configurazione disattivando FCM (e su Android, Analytics). Per farlo, aggiungi un valore dei metadati al tuo Info.plist (non al tuo GoogleService-Info.plist) sulle piattaforme Apple o al tuo AndroidManifest.xml su 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>

Swift

FirebaseMessagingAutoInitEnabled = NO

Per riattivare FCM, puoi effettuare una chiamata di runtime:

::firebase::messaging::SetTokenRegistrationOnInitEnabled(true);

Una volta impostato, questo valore rimane invariato dopo i riavvii dell'app.

FCM consente di inviare messaggi contenenti un link diretto alla tua app. Per ricevere messaggi contenenti un link diretto, devi aggiungere un nuovo filtro per intent all'attività che gestisce i link diretti per la tua app. Il filtro per intent deve rilevare i link diretti del tuo dominio. Se i messaggi non contengono un link diretto, questa configurazione non è necessaria. Nel file 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>

È anche possibile specificare un carattere jolly per rendere più flessibile il filtro intent. Ad esempio:

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

Quando gli utenti toccano una notifica contenente un link allo schema e all'host che hai specificato, la tua app avvierà l'attività con questo filtro per intent per gestire il link.

Passaggi successivi

Dopo aver configurato l'app client, puoi inviare messaggi downstream e sull'argomento con Firebase. Per saperne di più, guarda la dimostrazione di questa funzionalità nel esempio di avvio rapido che puoi scaricare, eseguire e esaminare.

Per aggiungere altri comportamenti più avanzati alla tua app, consulta le guide per l'invio di messaggi da un server app:

Tieni presente che per utilizzare queste funzionalità è necessaria un'implementazione del server.