| Seleziona la piattaforma: | iOS+ Android Web Flutter Unity C++ |
Questa guida descrive come iniziare a utilizzare Firebase Cloud Messaging nelle app client C++ in modo da poter inviare messaggi in modo affidabile.
Per scrivere l'app client multipiattaforma Firebase Cloud Messaging con C++, utilizza l' Firebase Cloud Messaging API. L'SDK C++ funziona sia per le piattaforme Android sia per quelle Apple, con alcune configurazioni aggiuntive richieste per ogni piattaforma. Per scoprire di più su come l'SDK C++ per iOS e Android funziona con FCM, consulta la pagina Informazioni su Firebase per C++.
Configurare Firebase e l'SDK FCM
Android
Se non l'hai già fatto, aggiungi Firebase al tuo progetto C++.
Nelle istruzioni di configurazione collegate, esamina i requisiti di dispositivo e app per l'utilizzo dell'SDK Firebase C++, inclusa la raccomandazione di utilizzare CMake per creare l'app.
Nel file
build.gradlea livello di progetto, assicurati di includere il repository Maven di Google nelle sezionibuildscripteallprojects.
Crea un oggetto App Firebase, passando l'ambiente JNI e l'attività:
app = ::firebase::App::Create(::firebase::AppOptions(), jni_env, activity);
Definisci 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 Google Play Services devono verificare che il dispositivo disponga di un APK Google Play Services compatibile prima di accedere alle funzionalità. Per saperne di più, consulta la sezione Controllare l'APK Google Play Services.
iOS+
- Se non l'hai già fatto,
aggiungi Firebase al tuo progetto C++. Poi,
per configurare il progetto per FCM:
- Nel Podfile del progetto, aggiungi la dipendenza FCM:
pod 'FirebaseMessaging'
- Trascina i framework
firebase.frameworkefirebase_messaging.frameworknel progetto Xcode dall'Firebase C++ SDK.
- Nel Podfile del progetto, aggiungi la dipendenza FCM:
Carica la chiave di autenticazione del servizio APN su Firebase. Se non hai già una chiave di autenticazione del servizio APN, assicurati di crearne una nel Centro membri per sviluppatori Apple.
-
All'interno del progetto nella console Firebase, seleziona l'icona a forma di ingranaggio , seleziona Impostazioni progetto e poi la scheda Cloud Messaging.
-
In Chiave di autenticazione del servizio APN nella sezione Configurazione app iOS, fai clic sul pulsante Carica per caricare la chiave di autenticazione di sviluppo, la chiave di autenticazione di produzione o entrambe. È necessaria almeno una chiave.
-
Vai alla posizione in cui hai salvato la chiave, selezionala e fai clic Apri. Aggiungi l'ID della chiave (disponibile nel Centro membri per sviluppatori Apple) e fai clic su Carica.
-
Configura il progetto Xcode per attivare le notifiche push:
- Seleziona il progetto dall'area Navigator.
- Seleziona la destinazione del progetto dall'area Editor.
Seleziona la scheda Generale dall'area Editor.
- Scorri fino a Framework e librerie collegati, quindi fai clic sul pulsante + per aggiungere i framework.
Nella finestra visualizzata, scorri fino a UserNotifications.framework, fai clic sulla voce, quindi fai clic su Aggiungi.
Questo framework viene visualizzato solo in Xcode 8 e versioni successive ed è richiesto da questa libreria.
Seleziona la scheda Funzionalità dall'area Editor.
- Imposta Notifiche push su Attiva.
- Scorri fino a Modalità in background, quindi impostala su Attiva.
- Seleziona Notifiche remote in Modalità in background.
Crea un oggetto App Firebase:
app = ::firebase::App::Create(::firebase::AppOptions());
Definisci 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);
Accedere al token di registrazione FCM
Dopo aver inizializzato la 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 un'istanza dell'app specifica, devi avere accesso a questo token.
Nota sulla consegna dei messaggi su Android
Quando l'app non è in esecuzione e un utente tocca una notifica,
per impostazione predefinita il messaggio non viene instradato 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 entrata al callback della libreria C++, devi sostituire il metodo onNewIntent nella tua attività e passare l' 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); } }
I messaggi ricevuti mentre l'app è in background utilizzano il contenuto del
campo della notifica per popolare la notifica della barra delle applicazioni, ma
questo contenuto della notifica non verrà comunicato a FCM. Ciò significa che Message::notification sarà un valore nullo.
In sintesi:
| Stato dell'app | Notifica | Dati | Entrambe |
|---|---|---|---|
| Primo piano | OnMessageReceived |
OnMessageReceived |
OnMessageReceived |
| Sfondo | Barra delle applicazioni | OnMessageReceived |
Notifica: barra delle applicazioni Dati: in extra dell'intent. |
Gestione dei messaggi personalizzati su Android
Per impostazione predefinita, le notifiche inviate all'app vengono passate 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 il file AndroidManifest.xml del progetto.
Sostituire i metodi ListenerService
ListenerService è la classe Java che intercetta i messaggi in entrata 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, dovrai estendere FCM's
predefinito ListenerService:
import com.google.firebase.messaging.cpp.ListenerService; class MyListenerService extends ListenerService {
Sostituendo 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 altri metodi utilizzati meno frequentemente.
Questi possono essere sostituiti. Per maggiori informazioni, consulta 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); }
Aggiornare AndroidManifest.xml
Una volta scritte, le classi personalizzate devono essere incluse in AndroidManifest.xml per essere applicate. 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 FCM predefinito di ListenerService. Questo manifest viene in genere unito al manifest specifico del progetto, in modo che ListenerService possa essere eseguito. Questo ListenerService deve essere sostituito con il servizio di listener personalizzato. Per farlo, rimuovi ListenerService predefinito e aggiungi il servizio personalizzato, che può essere eseguito 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 dell'SDK Firebase C++ (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>
Impedire l'inizializzazione automatica
FCM genera un token di registrazione per il targeting dell'istanza dell'app.
Quando viene generato un token, la libreria carica l'identificatore e i dati di configurazione su Firebase. Se vuoi ottenere un consenso esplicito prima di utilizzare il token, puoi impedire la generazione al momento della configurazione disattivando FCM (e, su Android, Analytics). Per farlo, aggiungi un valore di metadati a
Info.plist (non a GoogleService-Info.plist) sulle piattaforme Apple,
o a 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 anche dopo il riavvio dell'app.
Messaggi con link diretti su Android
FCM consente di inviare messaggi contenenti un link diretto all'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 intercettare i link diretti del tuo dominio. Se i messaggi non contengono un link 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 il filtro per intent più flessibile. 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 specificati, l'app avvierà l'attività con questo filtro per intent per gestire il link.
Passaggi successivi
Dopo aver completato i passaggi di configurazione, ecco alcune opzioni per procedere con FCM per C++: