Per inviare un messaggio a più dispositivi, utilizza Messaggistica per argomento. Questa funzionalità ti consente di inviare un messaggio a più dispositivi che hanno attivato un determinato argomento.
Questo tutorial si concentra sull'invio di messaggi argomenti dal server dell'app utilizzando l'Admin SDK o l'API REST per FCM e sulla ricezione e gestione di questi messaggi in un'app Apple. Questa pagina elenca tutti i passaggi per raggiungere questo obiettivo, dalla configurazione alla verifica, quindi potrebbe includere 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 riguarda le attività che potresti aver completato se hai già attivato altre funzionalità Firebase per la tua app. Per FCM in particolare, dovrai caricare la chiave di autenticazione APN e registrarti per le notifiche remote.
Prerequisiti
Installa quanto segue:
- Xcode 16.2 o versioni successive
Assicurati che il tuo progetto soddisfi i seguenti requisiti:
- Il tuo progetto deve avere come target queste versioni della piattaforma o versioni successive:
- iOS 13
- macOS 10.15
- tvOS 13
- watchOS 7
- Il tuo progetto deve avere come target queste versioni della piattaforma o versioni successive:
Configura un dispositivo Apple fisico per eseguire l'app e completa queste attività:
- Ottieni una chiave di autenticazione del servizio di notifiche push di Apple per il tuo account sviluppatore Apple.
- Attiva le notifiche push in XCode in App > Funzionalità.
- Accedi a Firebase utilizzando il tuo Account Google.
Se non hai già un progetto Xcode e vuoi solo 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 a cui connetterti. Visita la pagina Informazioni sui progetti Firebase per scoprire di più su questi progetti.
Registrare l'app con Firebase
Per utilizzare Firebase nella tua app Apple, devi registrarla nel tuo progetto Firebase. La registrazione dell'app viene spesso chiamata "aggiunta" dell'app al progetto.
Vai alla console Firebase.
Al centro della pagina di riepilogo del progetto, fai clic sull'icona iOS+ per avviare il flusso di lavoro della 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.
(Facoltativo) Inserisci altre informazioni sull'app: Nickname dell'app e ID App Store.
Fai clic su Registra app.
Aggiungere un file di configurazione di Firebase
Fai clic su Scarica GoogleService-Info.plist per ottenere il file di configurazione Firebase della tua app (
GoogleService-Info.plist
).Sposta il file di configurazione nella root del progetto Xcode. Se richiesto, seleziona l'opzione per aggiungere il file di configurazione a tutti i target.
Se nel tuo progetto sono presenti più ID bundle, 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
.
Aggiungere gli 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 (File > Aggiungi pacchetti).
- Quando richiesto, aggiungi il repository dell'SDK delle piattaforme Apple di Firebase:
- Scegli la raccolta Firebase Cloud Messaging.
- Aggiungi il flag
-ObjC
alla sezione Altri flag del linker delle impostazioni di build del target. - Per un'esperienza ottimale con Firebase Cloud Messaging, ti consigliamo di attivare Google Analytics nel tuo progetto Firebase e di aggiungere l'SDK Firebase per Google Analytics alla tua app. Puoi selezionare la libreria senza raccolta dell'IDFA o con raccolta dell'IDFA. Consulta le nostre domande frequenti sull'organizzazione più recente dei moduli in Google Analytics per l'SDK Firebase.
- Al termine, Xcode inizierà automaticamente a risolvere e a scaricare le tue dipendenze in background.
https://github.com/firebase/firebase-ios-sdk.git
Carica la chiave di autenticazione del servizio APN
Carica la chiave di autenticazione del servizio APN su Firebase. Se non hai ancora una chiave di autenticazione APNs, assicurati di crearne una nel Centro membri 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 APN nella sezione Configurazione app iOS, fai clic sul pulsante Carica.
-
Sfoglia fino alla posizione in cui hai salvato la chiave, selezionala e fai clic su Apri. Aggiungi l'ID chiave (disponibile nel Developer Member Center di Apple) 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 di seguito:
- Importa il modulo
FirebaseCore
nel tuoUIApplicationDelegate
, nonché tutti gli altri moduli Firebase utilizzati dal delegato dell'app. Ad esempio, per utilizzare Cloud Firestore e Authentication:SwiftUI
import SwiftUI import FirebaseCore import FirebaseFirestore import FirebaseAuth // ...
Swift
import FirebaseCore import FirebaseFirestore import FirebaseAuth // ...
Objective-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()
Swift
// Use Firebase library to configure APIs FirebaseApp.configure()
Objective-C
// Use Firebase library to configure APIs [FIRApp configure];
- Se utilizzi SwiftUI, devi creare un delegato dell'applicazione e collegarlo
alla struttura
App
tramiteUIApplicationDelegateAdaptor
oNSApplicationDelegateAdaptor
. Devi anche disattivare lo swizzling del delegato dell'app. Per ulteriori informazioni, consulta le istruzioni per SwiftUI.SwiftUI
@main struct YourApp: App { // register app delegate for Firebase setup @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate var body: some Scene { WindowGroup { NavigationView { ContentView() } } } }
Registrarsi per ricevere notifiche da remoto
All'avvio o nel punto desiderato del flusso dell'applicazione, registra l'app per le notifiche remote. ChiamaregisterForRemoteNotifications
come mostrato di seguito:
Swift
UNUserNotificationCenter.current().delegate = self let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound] UNUserNotificationCenter.current().requestAuthorization( options: authOptions, completionHandler: { _, _ in } ) application.registerForRemoteNotifications()
Objective-C
[UNUserNotificationCenter currentNotificationCenter].delegate = self; UNAuthorizationOptions authOptions = UNAuthorizationOptionAlert | UNAuthorizationOptionSound | UNAuthorizationOptionBadge; [[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:authOptions completionHandler:^(BOOL granted, NSError * _Nullable error) { // ... }]; [application registerForRemoteNotifications];
Abbonarsi a un argomento nell'app client
Le app client possono iscriversi a qualsiasi argomento esistente o crearne uno nuovo. 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 iscriversi.
Per abbonarti a un argomento, chiama il metodo di abbonamento dal thread principale della tua applicazione (FCM non è thread-safe). Se la richiesta di abbonamento non riesce inizialmente, FCM viene eseguito automaticamente un nuovo tentativo. 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:
Swift
Messaging.messaging().subscribe(toTopic: "weather") { error in print("Subscribed to weather topic") }
Objective-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 il numero unsubscribeFromTopic:topic
,
e FCM annulla l'iscrizione all'argomento in background.
Ricevere e gestire i messaggi degli argomenti
FCM recapita i messaggi dell'argomento nello stesso modo degli altri messaggi downstream.
Implementa application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
come mostrato:
Swift
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 }
Objective-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); }
Creare richieste di invio
Dopo aver creato un argomento, sottoscrivendo istanze dell'app client all'argomento sul lato client o tramite l'API server, puoi inviare messaggi all'argomento. Se è la prima volta che crei richieste di invio per FCM, consulta la guida all'ambiente server e a FCM per informazioni importanti su configurazione e contesto.
Nella logica di invio del backend, specifica il nome dell'argomento che preferisci come mostrato di seguito:
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);
});
Java
// 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);
Python
# 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)
Vai
// 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);
REST
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 cURL:
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, ovvero un'espressione booleana che specifica gli argomenti di destinazione. Ad esempio, la seguente condizione invierà messaggi ai
dispositivi iscritti a TopicA
e a TopicB
o TopicC
:
"'TopicA' in topics && ('TopicB' in topics || 'TopicC' in topics)"
FCM valuta prima le condizioni tra parentesi e poi 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);
});
Java
// 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);
Python
# 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)
Vai
// 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);
REST
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 cURL:
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
Passaggi successivi
- Puoi utilizzare il server per iscrivere le istanze dell'app client agli argomenti ed eseguire altre attività di gestione. Consulta Gestire le iscrizioni agli argomenti sul server.