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

Per scrivere il cross-platform Firebase cloud di messaggistica applicazione client con C ++, utilizzare il Firebase cloud Messaging API. L'SDK C++ funziona sia per Android che per iOS, con alcune configurazioni aggiuntive richieste per ogni piattaforma.

Configura Firebase e l'SDK FCM

Android

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

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

    • Nel vostro a livello di progetto build.gradle file, assicurarsi di includere repository Maven di Google sia nella vostra buildscript e allprojects sezioni.

  2. Creare un oggetto Firebase App, passando per l'ambiente JNI e attività:

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

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

  4. Inizializza FCM, che passa in App e costruito Listener:

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

  5. Le app che si basano sull'SDK dei servizi di Google Play dovrebbero controllare il dispositivo per un APK di servizi di Google Play compatibile prima di accedere alle funzionalità. Per ulteriori informazioni, fare riferimento a Verificare la presenza di Google Play Services APK .

iOS

  1. Hai bisogno di una valida APN certificato. Se non ne hai già uno, assicuratevi di crearne uno nel Centro membri di Apple Developer .
  2. Se non lo hai già fatto, aggiungi Firebase al progetto C ++ . Quindi, per impostare il tuo progetto per FCM:
    1. In Podfile del progetto, aggiungere la dipendenza FCM:
      pod 'Firebase/Messaging'
    2. Trascinare il firebase.framework e firebase_messaging.framework quadri nel progetto Xcode dalla Firebase SDK C ++ .
  3. Configura il tuo progetto Xcode per abilitare le notifiche push:

    1. Selezionare il progetto dalla zona Navigator.
    2. Selezionare il target del progetto dall'area Editor.
    3. Selezionare la scheda Generale dalla zona Editor.

      1. Scorrere verso il basso per Linked quadri e biblioteche, quindi fare clic sul pulsante + per aggiungere quadri.
      2. Nella finestra che appare, scorrere fino a UserNotifications.framework, cliccare su quella voce, quindi fare clic su Aggiungi.

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

    4. Selezionare la scheda Funzionalità dall'area Editor.

      1. Passare Notifiche Push On.
      2. Scorrere verso il basso per sfondo modalità, quindi passare a On.
      3. Selezionare le notifiche remoto sotto Modalità di sfondo.
  4. Creare un oggetto Firebase App:

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

  5. Definire una classe che implementa l' firebase::messaging::Listener interfaccia.

  6. Inizializza Firebase cloud di messaggistica, che passa in App e un ascoltatore costruito:

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

Accedi al token di registrazione del dispositivo

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

Se vuoi scegliere come target quel dispositivo specifico, avrai bisogno dell'accesso a questo token.

Nota sulla consegna dei messaggi su Android

Quando l'app non è affatto in esecuzione e un utente tocca una notifica, il messaggio non viene, per impostazione predefinita, instradato tramite i callback incorporati di FCM. In questo caso, i payload dei messaggi vengono ricevuti attraverso un Intent utilizzato per avviare l'applicazione. Per avere FCM avanti questi messaggi in entrata al callback libreria C ++, è necessario eseguire l'override del metodo onNewIntent nella vostra attività e passare il 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 hanno il contenuto del loro campo di notifica utilizzato per popolare la notifica della barra delle applicazioni, ma quel contenuto di notifica non verrà comunicato a FCM. Cioè, Message::notification sarà un nullo.

In sintesi:

Stato dell'app Notifica Dati Entrambi
Primo piano OnMessageReceived OnMessageReceived OnMessageReceived
Sfondo Area di notifica OnMessageReceived Notifica: vassoio di sistema
Dati: in extra dell'intento.

Gestione dei messaggi personalizzati su Android

Per impostazione predefinita, le notifiche inviate al app vengono passati a ::firebase::messaging::Listener::OnMessageReceived , ma in alcuni casi si consiglia di ignorare il comportamento predefinito. Per fare questo su Android è necessario scrivere classi personalizzate che estendono com.google.firebase.messaging.cpp.ListenerService così come l'aggiornamento del progetto AndroidManifest.xml .

Override ListenerService Metodi.

Il ListenerService è la classe Java che intercetta i messaggi in arrivo inviati al app e percorsi li alla libreria C ++. Quando l'app è in primo piano (o quando l'app è in background e riceve un payload di soli dati), i messaggi passeranno attraverso uno dei callback forniti su questa classe. Per aggiungere un comportamento personalizzato per la gestione dei messaggi, è necessario estendere default di FCM ListenerService :

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

class MyListenerService extends ListenerService {

Con l'override del metodo ListenerService.onMessageReceived , è possibile eseguire azioni in base alla ricevuta RemoteMessage oggetto e ottenere i dati del messaggio:

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

ListenerService ha anche un paio di altri metodi che vengono utilizzati meno frequentemente. Questi possono essere ridefinite, nonché, per ulteriori informazioni consultare il FirebaseMessagingService di riferimento.

@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);
}

Aggiornamento AndroidManifest.xml

Una volta che le classi personalizzate sono stati scritti, essi devono essere compresi nel AndroidManifest.xml abbia effetto. Assicurarsi che il manifesto include gli strumenti di unione dichiarando l'attributo appropriato all'interno del <manifest> tag, in questo modo:

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

Nel firebase_messaging_cpp.aar dell'archivio c'è un AndroidManifest.xml di file che dichiara di default di FCM ListenerService . Il manifesto è normalmente fusa con lo specifico progetto di manifesto che è come il ListenerService è in grado di eseguire. Questo ListenerService ha bisogno di sostituire con il servizio cusom ascoltatore. Ciò si ottiene rimuovendo il default ListenerService e aggiungendo il servizio personalizzato, che può essere fatto con le seguenti righe vostri progetti AndroidManifest.xml di file:

<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 di Firebase SDK C ++ (7.1.0 in poi) l'uso JobIntentService che richiede ulteriori modifiche in AndroidManifest.xml di file.

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

Impedisci l'inizializzazione automatica

FCM genera un token di registrazione per il targeting per dispositivo. Quando viene generato un token, la libreria carica l'identificatore e i dati di configurazione su Firebase. Se desideri ottenere un consenso esplicito prima di utilizzare il token, puoi impedire la generazione al momento della configurazione disabilitando FCM (e su Android, Analytics). Per fare questo, aggiungere un valore metadati al tuo Info.plist (non il tuo GoogleService-Info.plist ) su iOS, o il vostro 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>

iOS

FirebaseMessagingAutoInitEnabled = NO

Per riattivare FCM, puoi effettuare una chiamata di runtime:

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

Questo valore persiste tra i riavvii dell'app una volta impostato.

FCM consente di inviare messaggi contenenti un collegamento diretto alla tua app. Per ricevere messaggi che contengono un link diretto, devi aggiungere un nuovo filtro di intent all'attività che gestisce i link diretti per la tua app. Il filtro intent dovrebbe catturare i deep link del tuo dominio. Se i tuoi messaggi non contengono un deep link, questa configurazione non è necessaria. In 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 di intenti. Per 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 collegamento allo schema e all'host che specifichi, la tua app avvierà l'attività con questo filtro di intenti per gestire il collegamento.

Prossimi passi

Dopo aver configurato l'app client, sei pronto per inviare messaggi downstream e topic con Firebase. Per ulteriori informazioni, consultare questa funzionalità dimostrata nel campione quickstart che si può scaricare, corsa, e la revisione.

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

Tenete a mente che avrete bisogno di un server di attuazione a fare uso di queste caratteristiche.