Per scrivere la tua app client Firebase Cloud Messaging multipiattaforma con C++, utilizza l'API Firebase Cloud Messaging . L'SDK C++ funziona per entrambe le piattaforme Android e Apple, con alcune configurazioni aggiuntive necessarie per ogni piattaforma.
Configura Firebase e l'SDK di FCM
Androide
Se non l'hai già fatto, aggiungi Firebase al tuo progetto C++ .
Nelle istruzioni di configurazione collegate, esamina i requisiti del dispositivo e dell'app per l'utilizzo dell'SDK Firebase C++, inclusa la raccomandazione di utilizzare CMake per creare la tua app.
Nel tuo file
build.gradle
a livello di progetto, assicurati di includere il repository Maven di Google in entrambe le sezionibuildscript
eallprojects
.
Crea un oggetto app Firebase, passando l'ambiente JNI e l'attività:
app = ::firebase::App::Create(::firebase::AppOptions(), jni_env, activity);
Definire una classe che implementa l'interfaccia
firebase::messaging::Listener
.Inizializza FCM, passando l'App e un Listener costruito:
::firebase::messaging::Initialize(app, listener);
Le app che si basano sull'SDK dei servizi di Google Play devono controllare il dispositivo per un APK dei servizi di Google Play compatibile prima di accedere alle funzionalità. Per saperne di più, consulta Verifica l'APK dei servizi di Google Play .
iOS+
- È necessario un certificato APNs valido. Se non ne hai già uno, assicurati di crearne uno nell'Apple Developer Member Center .
- Se non l'hai già fatto, aggiungi Firebase al tuo progetto C++ . Quindi, per impostare il tuo progetto per FCM:
- Nel Podfile del tuo progetto, aggiungi la dipendenza FCM:
pod 'FirebaseMessaging'
- Trascina i framework
firebase.framework
efirebase_messaging.framework
nel tuo progetto Xcode da Firebase C++ SDK .
- Nel Podfile del tuo progetto, aggiungi la dipendenza FCM:
Configura il tuo progetto Xcode per abilitare le notifiche push:
- Selezionare il progetto dall'area Navigator .
- Selezionare la destinazione del progetto dall'area Editor .
Selezionare la scheda Generale dall'area Editor .
- Scorri verso il basso fino a Linked Frameworks and Libraries , quindi fai clic sul pulsante + per aggiungere framework.
Nella finestra visualizzata, scorri fino a UserNotifications.framework , fai clic su tale voce, quindi fai clic su Aggiungi .
Questo framework appare solo in Xcode v8 e versioni successive ed è richiesto da questa libreria.
Selezionare la scheda Funzionalità dall'area Editor .
- Imposta Notifiche push su On .
- Scorri verso il basso fino a Modalità in background , quindi impostalo su On .
- Seleziona Notifiche remote in Modalità in background .
Crea un oggetto App Firebase:
app = ::firebase::App::Create(::firebase::AppOptions());
Definire una classe che implementa l'interfaccia
firebase::messaging::Listener
.Inizializza Firebase Cloud Messaging, passando l'app e un listener 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'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, avrai bisogno di accedere 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 attraverso i callback incorporati 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 Activity e passare l' 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 tale contenuto della notifica non verrà comunicato a FCM. Cioè, Message::notification
sarà 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 personalizzata dei messaggi su Android
Per impostazione predefinita, le notifiche inviate all'app vengono passate a ::firebase::messaging::Listener::OnMessageReceived
, ma in alcuni casi potresti voler sovrascrivere il comportamento predefinito. Per fare ciò su Android dovrai scrivere classi personalizzate che estendono com.google.firebase.messaging.cpp.ListenerService
e aggiornare AndroidManifest.xml
del tuo progetto.
Eseguire l'override dei 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 l'app è in background e riceve un payload di soli dati), i messaggi passeranno attraverso uno dei callback forniti in questa classe. Per aggiungere un comportamento personalizzato alla gestione dei messaggi, dovrai estendere ListenerService
predefinito di FCM :
import com.google.firebase.messaging.cpp.ListenerService; class MyListenerService extends ListenerService {
Sovrascrivendo il metodo ListenerService.onMessageReceived
, puoi eseguire azioni basate sull'oggetto RemoteMessage ricevuto 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 alcuni altri metodi che vengono utilizzati meno frequentemente. Anche questi possono essere sovrascritti, per ulteriori informazioni vedere il riferimento 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 che le tue classi personalizzate sono state scritte, devono essere incluse in AndroidManifest.xml
per avere effetto. Assicurati che il manifest includa gli strumenti di unione dichiarando l'attributo appropriato all'interno del tag <manifest>
, 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">
Nell'archivio firebase_messaging_cpp.aar
è presente un file AndroidManifest.xml
che dichiara ListenerService
predefinito di FCM. Questo manifest viene normalmente unito al manifest specifico del progetto, che è il modo in cui ListenerService
è in grado di essere eseguito. Questo ListenerService
deve essere sostituito con il servizio listener personalizzato. Ciò si ottiene rimuovendo il ListenerService
predefinito e aggiungendo il servizio personalizzato, operazione che può essere eseguita con le seguenti righe del file AndroidManifest.xml
dei progetti:
<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 C++ SDK (7.1.0 e successive) 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>
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 ciò, aggiungi un valore di metadati al tuo Info.plist
(non al tuo GoogleService-Info.plist
) su piattaforme Apple o al tuo AndroidManifest.xml
su 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>
Rapido
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.
Gestione dei messaggi con deep link su Android
FCM consente l'invio di messaggi contenenti un collegamento diretto alla tua app. Per ricevere messaggi che contengono un collegamento diretto, devi aggiungere un nuovo filtro intent all'attività che gestisce i collegamenti diretti per la tua app. Il filtro intent dovrebbe catturare i link diretti del tuo dominio. Se i tuoi messaggi non contengono un collegamento diretto, 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 intent. 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 specificati, la tua app avvierà l'attività con questo filtro intent 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, vedere questa funzionalità dimostrata nell'esempio di avvio rapido che è possibile scaricare, eseguire ed esaminare.
Per aggiungere altri comportamenti più avanzati alla tua app, consulta le guide per l'invio di messaggi da un server dell'app:
Tieni presente che avrai bisogno di un'implementazione del server per utilizzare queste funzionalità.