Per indirizzare un messaggio a più dispositivi, utilizza la messaggistica per argomenti . Questa funzione consente di inviare un messaggio a più dispositivi che hanno aderito a un determinato argomento.
Questo tutorial è incentrato sull'invio di messaggi di argomento dal tuo server dell'app utilizzando l' Admin SDK o l'API REST per FCM e sulla loro ricezione e gestione in un'app Apple. Questa pagina elenca tutti i passaggi per raggiungere questo obiettivo, dall'installazione alla verifica, quindi potrebbe coprire i passaggi che hai già completato se hai configurato un'app client Apple per FCM o hai seguito i passaggi per inviare il tuo primo messaggio .
Aggiungi Firebase al tuo progetto Apple
Questa sezione copre le attività che potresti aver completato se hai già abilitato altre funzionalità di Firebase per la tua app. Per FCM in particolare, dovrai caricare la tua chiave di autenticazione APNs e registrarti per le notifiche remote .
Prerequisiti
Installa quanto segue:
- Xcode 14.1 o successivo
Assicurati che il tuo progetto soddisfi questi requisiti:
- Il tuo progetto deve avere come target queste versioni della piattaforma o successive:
- iOS 11
- Mac OS 10.13
- tv OS 12
- watch OS 6
- Il tuo progetto deve avere come target queste versioni della piattaforma o successive:
Configura un dispositivo Apple fisico per eseguire la tua app e completa queste attività:
- Ottieni una chiave di autenticazione per le notifiche push Apple per il tuo account sviluppatore Apple .
- Abilita le notifiche push in XCode in App > Funzionalità .
- Accedi a Firebase utilizzando il tuo account Google.
Se non disponi già di un progetto Xcode e desideri semplicemente provare un prodotto Firebase, puoi scaricare uno dei nostri esempi di avvio rapido .
Crea un progetto Firebase
Prima di poter aggiungere Firebase alla tua app Apple, devi creare un progetto Firebase per connetterti alla tua app. Visita Capire i progetti Firebase per saperne di più sui progetti Firebase.
Registra la tua app con Firebase
Per utilizzare Firebase nella tua app Apple, devi registrare la tua app con il tuo progetto Firebase. La registrazione della tua app viene spesso chiamata "aggiunta" della tua app al tuo progetto.
Vai alla console di Firebase .
Al centro della pagina della panoramica del progetto, fai clic sull'icona iOS+ per avviare il flusso di lavoro di configurazione.
Se hai già aggiunto un'app al tuo progetto Firebase, fai clic su Aggiungi app per visualizzare le opzioni della piattaforma.
Inserisci l'ID bundle della tua app nel campo ID bundle .
Un ID pacchetto identifica in modo univoco un'applicazione nell'ecosistema di Apple.
Trova il tuo ID bundle: apri il tuo progetto in Xcode, seleziona l'app di primo livello nel navigatore del progetto, quindi seleziona la scheda Generale .
Il valore del campo Identificatore pacchetto è l'ID pacchetto (ad esempio,
com.yourcompany.yourproject
).Tieni presente che il valore dell'ID pacchetto fa distinzione tra maiuscole e minuscole e non può essere modificato per questa app Firebase dopo che è stata registrata con il tuo progetto Firebase.
(Facoltativo) Inserisci altre informazioni sull'app: nickname dell'app e ID dell'App Store .
Nickname dell'app : un identificatore di convenienza interno visibile solo a te nella console di Firebase
ID App Store : utilizzato da Firebase Dynamic Links per reindirizzare gli utenti alla tua pagina App Store e da Google Analytics per importare eventi di conversione in Google Ads . Se la tua app non ha ancora un ID App Store, puoi aggiungere l'ID in un secondo momento nelle impostazioni del progetto .
Fai clic su Registra app .
Aggiungi un file di configurazione Firebase
Fai clic su Scarica GoogleService-Info.plist per ottenere il file di configurazione delle piattaforme Firebase Apple (
GoogleService-Info.plist
).Il file di configurazione di Firebase contiene identificatori univoci ma non segreti per il tuo progetto. Per ulteriori informazioni su questo file di configurazione, visita Understand Firebase Projects .
Puoi scaricare di nuovo il file di configurazione di Firebase in qualsiasi momento.
Assicurati che il nome del file di configurazione non sia aggiunto con caratteri aggiuntivi, come
(2)
.
Sposta il tuo file di configurazione nella radice del tuo progetto Xcode. Se richiesto, selezionare per aggiungere il file di configurazione a tutte le destinazioni.
Se disponi di più ID bundle nel tuo progetto, devi associare ogni ID bundle a un'app registrata nella console Firebase in modo che ogni app possa avere il proprio file GoogleService-Info.plist
.
Aggiungi SDK Firebase alla tua app
Utilizza Swift Package Manager per installare e gestire le dipendenze di Firebase.
- In Xcode, con il progetto dell'app aperto, vai a File > Add Packages .
- Quando richiesto, aggiungi il repository SDK delle piattaforme Firebase Apple:
- Scegli la libreria Firebase Cloud Messaging.
- Per un'esperienza ottimale con Firebase Cloud Messaging, ti consigliamo di abilitare Google Analytics nel tuo progetto Firebase e di aggiungere l'SDK Firebase per Google Analytics alla tua app. È possibile selezionare la libreria senza raccolta IDFA o con raccolta IDFA.
- Al termine, Xcode inizierà automaticamente a risolvere e scaricare le tue dipendenze in background.
https://github.com/firebase/firebase-ios-sdk
Carica la tua chiave di autenticazione APNs
Carica la tua chiave di autenticazione APN su Firebase. Se non disponi già di una chiave di autenticazione APNs, assicurati di crearne una nell'Apple Developer Member Center .
All'interno del progetto nella console Firebase, seleziona l'icona a forma di ingranaggio, seleziona Impostazioni progetto , quindi seleziona la scheda Cloud Messaging .
Nella chiave di autenticazione APN in Configurazione app iOS , fai clic sul pulsante Carica .
Passare alla posizione in cui è stata salvata la chiave, selezionarla e fare clic su Apri . Aggiungi l'ID chiave per la chiave (disponibile nell'Apple Developer Member Center ) e fai clic su Carica .
Inizializza Firebase nella tua app
Dovrai aggiungere il codice di inizializzazione di Firebase alla tua applicazione. Importa il modulo Firebase e configura un'istanza condivisa come mostrato:
- Importa il modulo
FirebaseCore
nel tuoUIApplicationDelegate
, così come qualsiasi altro modulo Firebase utilizzato dal delegato dell'app. Ad esempio, per utilizzare Cloud Firestore e l'autenticazione:SwiftUI
import SwiftUI import FirebaseCore import FirebaseFirestore import FirebaseAuth // ...
Rapido
import FirebaseCore import FirebaseFirestore import FirebaseAuth // ...
Obiettivo-C
@import FirebaseCore; @import FirebaseFirestore; @import FirebaseAuth; // ...
- Configura un'istanza condivisa
FirebaseApp
nel metodoapplication(_:didFinishLaunchingWithOptions:)
del delegato dell'app:SwiftUI
// Use Firebase library to configure APIs FirebaseApp.configure()
Rapido
// Use Firebase library to configure APIs FirebaseApp.configure()
Obiettivo-C
// Use Firebase library to configure APIs [FIRApp configure];
- Se utilizzi SwiftUI, devi creare un delegato dell'applicazione e allegarlo alla struttura
App
tramiteUIApplicationDelegateAdaptor
oNSApplicationDelegateAdaptor
. È inoltre necessario disabilitare lo scorrimento del delegato dell'app. Per ulteriori informazioni, consulta le istruzioni SwiftUI .SwiftUI
@main struct YourApp: App { // register app delegate for Firebase setup @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate var body: some Scene { WindowGroup { NavigationView { ContentView() } } } }
Registrati per le notifiche remote
All'avvio o nel punto desiderato nel flusso dell'applicazione, registra la tua app per le notifiche remote. ChiamareregisterForRemoteNotifications
come mostrato:Rapido
UNUserNotificationCenter.current().delegate = self let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound] UNUserNotificationCenter.current().requestAuthorization( options: authOptions, completionHandler: { _, _ in } ) application.registerForRemoteNotifications()
Obiettivo-C
[UNUserNotificationCenter currentNotificationCenter].delegate = self; UNAuthorizationOptions authOptions = UNAuthorizationOptionAlert | UNAuthorizationOptionSound | UNAuthorizationOptionBadge; [[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:authOptions completionHandler:^(BOOL granted, NSError * _Nullable error) { // ... }]; [application registerForRemoteNotifications];
Sottoscrivere l'app client a un argomento
Le app client possono iscriversi a qualsiasi argomento esistente oppure possono creare un nuovo argomento. Quando un'app client si iscrive a un nuovo nome di argomento (uno che non esiste già per il tuo progetto Firebase), viene creato un nuovo argomento con quel nome in FCM e qualsiasi client può successivamente sottoscriverlo.
Per sottoscrivere un argomento, chiama il metodo di sottoscrizione dal thread principale della tua applicazione (FCM non è thread-safe). Se inizialmente la richiesta di sottoscrizione non riesce, FCM riprova automaticamente. Per i casi in cui l'abbonamento non può essere completato, l'abbonamento genera un errore che puoi rilevare in un gestore di completamento come mostrato:
Rapido
Messaging.messaging().subscribe(toTopic: "weather") { error in print("Subscribed to weather topic") }
Obiettivo-C
[[FIRMessaging messaging] subscribeToTopic:@"weather" completion:^(NSError * _Nullable error) { NSLog(@"Subscribed to weather topic"); }];
Questa chiamata effettua una richiesta asincrona al backend FCM e iscrive il client all'argomento specificato. Prima di chiamare subscribeToTopic:topic
, assicurati che l'istanza dell'app client abbia già ricevuto un token di registrazione tramite il callback didReceiveRegistrationToken
.
Ogni volta che l'app viene avviata, FCM si assicura che tutti gli argomenti richiesti siano stati sottoscritti. Per annullare l'iscrizione, chiama unsubscribeFromTopic:topic
e FCM annulla l'iscrizione all'argomento in background.
Ricevere e gestire i messaggi di argomento
FCM consegna i messaggi topic allo stesso modo degli altri messaggi downstream.
Implementa application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
come mostrato:
Rapido
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) async -> UIBackgroundFetchResult { // If you are receiving a notification message while your app is in the background, // this callback will not be fired till the user taps on the notification launching the application. // TODO: Handle data of notification // With swizzling disabled you must let Messaging know about the message, for Analytics // Messaging.messaging().appDidReceiveMessage(userInfo) // Print message ID. if let messageID = userInfo[gcmMessageIDKey] { print("Message ID: \(messageID)") } // Print full message. print(userInfo) return UIBackgroundFetchResult.newData }
Obiettivo-C
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { // If you are receiving a notification message while your app is in the background, // this callback will not be fired till the user taps on the notification launching the application. // TODO: Handle data of notification // With swizzling disabled you must let Messaging know about the message, for Analytics // [[FIRMessaging messaging] appDidReceiveMessage:userInfo]; // ... // Print full message. NSLog(@"%@", userInfo); completionHandler(UIBackgroundFetchResultNewData); }
Crea richieste di invio
Dopo aver creato un argomento, sottoscrivendo le istanze dell'app client all'argomento sul lato client o tramite l' API del server , puoi inviare messaggi all'argomento. Se è la prima volta che crei richieste di invio per FCM, consulta la guida al tuo ambiente server e FCM per importanti informazioni di base e di configurazione.
Nella tua logica di invio sul back-end, specifica il nome dell'argomento desiderato come mostrato:
Node.js
// The topic name can be optionally prefixed with "/topics/".
const topic = 'highScores';
const message = {
data: {
score: '850',
time: '2:45'
},
topic: topic
};
// Send a message to devices subscribed to the provided topic.
getMessaging().send(message)
.then((response) => {
// Response is a message ID string.
console.log('Successfully sent message:', response);
})
.catch((error) => {
console.log('Error sending message:', error);
});
Giava
// The topic name can be optionally prefixed with "/topics/".
String topic = "highScores";
// See documentation on defining a message payload.
Message message = Message.builder()
.putData("score", "850")
.putData("time", "2:45")
.setTopic(topic)
.build();
// Send a message to the devices subscribed to the provided topic.
String response = FirebaseMessaging.getInstance().send(message);
// Response is a message ID string.
System.out.println("Successfully sent message: " + response);
Pitone
# The topic name can be optionally prefixed with "/topics/".
topic = 'highScores'
# See documentation on defining a message payload.
message = messaging.Message(
data={
'score': '850',
'time': '2:45',
},
topic=topic,
)
# Send a message to the devices subscribed to the provided topic.
response = messaging.send(message)
# Response is a message ID string.
print('Successfully sent message:', response)
Andare
// The topic name can be optionally prefixed with "/topics/".
topic := "highScores"
// See documentation on defining a message payload.
message := &messaging.Message{
Data: map[string]string{
"score": "850",
"time": "2:45",
},
Topic: topic,
}
// Send a message to the devices subscribed to the provided topic.
response, err := client.Send(ctx, message)
if err != nil {
log.Fatalln(err)
}
// Response is a message ID string.
fmt.Println("Successfully sent message:", response)
C#
// The topic name can be optionally prefixed with "/topics/".
var topic = "highScores";
// See documentation on defining a message payload.
var message = new Message()
{
Data = new Dictionary<string, string>()
{
{ "score", "850" },
{ "time", "2:45" },
},
Topic = topic,
};
// Send a message to the devices subscribed to the provided topic.
string response = await FirebaseMessaging.DefaultInstance.SendAsync(message);
// Response is a message ID string.
Console.WriteLine("Successfully sent message: " + response);
RIPOSO
POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1
Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA
{
"message":{
"topic" : "foo-bar",
"notification" : {
"body" : "This is a Firebase Cloud Messaging Topic Message!",
"title" : "FCM Message"
}
}
}
comando URL:
curl -X POST -H "Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA" -H "Content-Type: application/json" -d '{
"message": {
"topic" : "foo-bar",
"notification": {
"body": "This is a Firebase Cloud Messaging Topic Message!",
"title": "FCM Message"
}
}
}' https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1
Per inviare un messaggio a una combinazione di argomenti, specifica una condizione , che è un'espressione booleana che specifica gli argomenti di destinazione. Ad esempio, la seguente condizione invierà messaggi ai dispositivi che sono iscritti a TopicA
e TopicB
o TopicC
:
"'TopicA' in topics && ('TopicB' in topics || 'TopicC' in topics)"
FCM prima valuta tutte le condizioni tra parentesi, quindi valuta l'espressione da sinistra a destra. Nell'espressione precedente, un utente iscritto a un singolo argomento non riceve il messaggio. Allo stesso modo, un utente che non si iscrive a TopicA
non riceve il messaggio. Queste combinazioni lo ricevono:
-
TopicA
eTopicB
-
TopicA
eTopicC
Puoi includere fino a cinque argomenti nell'espressione condizionale.
Per inviare a una condizione:
Node.js
// Define a condition which will send to devices which are subscribed
// to either the Google stock or the tech industry topics.
const condition = '\'stock-GOOG\' in topics || \'industry-tech\' in topics';
// See documentation on defining a message payload.
const message = {
notification: {
title: '$FooCorp up 1.43% on the day',
body: '$FooCorp gained 11.80 points to close at 835.67, up 1.43% on the day.'
},
condition: condition
};
// Send a message to devices subscribed to the combination of topics
// specified by the provided condition.
getMessaging().send(message)
.then((response) => {
// Response is a message ID string.
console.log('Successfully sent message:', response);
})
.catch((error) => {
console.log('Error sending message:', error);
});
Giava
// Define a condition which will send to devices which are subscribed
// to either the Google stock or the tech industry topics.
String condition = "'stock-GOOG' in topics || 'industry-tech' in topics";
// See documentation on defining a message payload.
Message message = Message.builder()
.setNotification(Notification.builder()
.setTitle("$GOOG up 1.43% on the day")
.setBody("$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.")
.build())
.setCondition(condition)
.build();
// Send a message to devices subscribed to the combination of topics
// specified by the provided condition.
String response = FirebaseMessaging.getInstance().send(message);
// Response is a message ID string.
System.out.println("Successfully sent message: " + response);
Pitone
# Define a condition which will send to devices which are subscribed
# to either the Google stock or the tech industry topics.
condition = "'stock-GOOG' in topics || 'industry-tech' in topics"
# See documentation on defining a message payload.
message = messaging.Message(
notification=messaging.Notification(
title='$GOOG up 1.43% on the day',
body='$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.',
),
condition=condition,
)
# Send a message to devices subscribed to the combination of topics
# specified by the provided condition.
response = messaging.send(message)
# Response is a message ID string.
print('Successfully sent message:', response)
Andare
// Define a condition which will send to devices which are subscribed
// to either the Google stock or the tech industry topics.
condition := "'stock-GOOG' in topics || 'industry-tech' in topics"
// See documentation on defining a message payload.
message := &messaging.Message{
Data: map[string]string{
"score": "850",
"time": "2:45",
},
Condition: condition,
}
// Send a message to devices subscribed to the combination of topics
// specified by the provided condition.
response, err := client.Send(ctx, message)
if err != nil {
log.Fatalln(err)
}
// Response is a message ID string.
fmt.Println("Successfully sent message:", response)
C#
// Define a condition which will send to devices which are subscribed
// to either the Google stock or the tech industry topics.
var condition = "'stock-GOOG' in topics || 'industry-tech' in topics";
// See documentation on defining a message payload.
var message = new Message()
{
Notification = new Notification()
{
Title = "$GOOG up 1.43% on the day",
Body = "$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.",
},
Condition = condition,
};
// Send a message to devices subscribed to the combination of topics
// specified by the provided condition.
string response = await FirebaseMessaging.DefaultInstance.SendAsync(message);
// Response is a message ID string.
Console.WriteLine("Successfully sent message: " + response);
RIPOSO
POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1
Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA
{
"message":{
"condition": "'dogs' in topics || 'cats' in topics",
"notification" : {
"body" : "This is a Firebase Cloud Messaging Topic Message!",
"title" : "FCM Message",
}
}
}
comando URL:
curl -X POST -H "Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA" -H "Content-Type: application/json" -d '{
"notification": {
"title": "FCM Message",
"body": "This is a Firebase Cloud Messaging Topic Message!",
},
"condition": "'dogs' in topics || 'cats' in topics"
}' https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1
Prossimi passi
- Puoi usare il tuo server per sottoscrivere le istanze dell'app client agli argomenti ed eseguire altre attività di gestione. Vedere Gestire le sottoscrizioni agli argomenti sul server .