Pour cibler un message sur plusieurs appareils, utilisez la messagerie thématique. Cette fonctionnalité vous permet d'envoyer un message à plusieurs appareils qui se sont abonnés à un thème spécifique.
Ce tutoriel se concentre sur l'envoi de messages thématiques depuis votre serveur d'application à l'aide de l'Admin SDK ou de l'API REST pour FCM, ainsi que sur leur réception et leur traitement dans une application Apple. Cette page liste toutes les étapes à suivre pour y parvenir, de la configuration à la validation. Il est donc possible que vous ayez déjà effectué certaines étapes si vous avez configuré une application cliente Apple pour FCM ou suivi les étapes pour envoyer votre premier message.
Ajouter Firebase à votre projet Apple
Cette section couvre les tâches que vous avez peut-être déjà effectuées si vous avez activé d'autres fonctionnalités Firebase pour votre application. Pour FCM en particulier, vous devrez importer votre clé d'authentification APNs et vous inscrire aux notifications à distance.
Prérequis
Installez les éléments suivants :
- Xcode 16.2 ou version ultérieure
Assurez-vous que votre projet répond aux exigences suivantes :
- Votre projet doit cibler les versions de plate-forme suivantes ou une version ultérieure :
- iOS 13
- macOS 10.15
- tvOS 13
- watchOS 7
- Votre projet doit cibler les versions de plate-forme suivantes ou une version ultérieure :
Configurez un appareil Apple physique pour exécuter votre application et effectuez les tâches suivantes :
- Obtenez une clé d'authentification Apple Push Notification pour votre compte de développeur Apple.
- Activez les notifications push dans Xcode sous App > Capabilities.
- Connectez-vous à Firebase avec votre compte Google.
Si vous ne disposez pas encore d'un projet Xcode et que vous souhaitez simplement essayer un produit Firebase, vous pouvez télécharger l'un de nos exemples de démarrage rapide.
Créer un projet Firebase
Avant de pouvoir ajouter Firebase à votre application Apple, vous devez créer un projet Firebase pour vous connecter à votre application. Consultez Comprendre les projets Firebase pour en savoir plus sur les projets Firebase.
Enregistrer votre application auprès de Firebase
Pour utiliser Firebase dans votre application Apple, vous devez enregistrer votre application dans votre projet Firebase. L'enregistrement de votre application est souvent appelé "ajout" de votre application à votre projet.
Accédez à la console Firebase.
Au centre de la page de présentation du projet, cliquez sur l'icône iOS+ pour lancer le workflow de configuration.
Si vous avez déjà ajouté une application à votre projet Firebase, cliquez sur Ajouter une application pour afficher les options de plate-forme.
Saisissez l'ID du bundle de votre application dans le champ ID du bundle.
(Facultatif) Saisissez d'autres informations sur l'application : Nom de l'application et ID de l'App Store.
Cliquez sur Enregistrer l'application.
Ajouter un fichier de configuration Firebase
Cliquez sur Télécharger GoogleService-Info.plist pour obtenir le fichier de configuration Firebase de votre application (
GoogleService-Info.plist
).Déplacez votre fichier de configuration à la racine de votre projet Xcode. Si vous y êtes invité, sélectionnez l'option permettant d'ajouter le fichier de configuration à toutes les cibles.
Si votre projet comporte plusieurs ID de bundle, vous devez associer chacun d'eux à une application enregistrée dans la console Firebase afin que chaque application puisse avoir son propre fichier GoogleService-Info.plist
.
Ajouter les SDK Firebase à votre application
Utilisez Swift Package Manager pour installer et gérer les dépendances Firebase.
- Dans Xcode, à partir de votre projet d'application ouvert, accédez à File > Add Packages (Fichier > Ajouter des packages).
- Lorsque vous y êtes invité, ajoutez le dépôt du SDK des plates-formes Firebase pour Apple :
- Choisissez la bibliothèque Firebase Cloud Messaging.
- Ajoutez l'indicateur
-ObjC
à la section Other Linker Flags (Autres indicateurs Linker) des paramètres de compilation de votre cible. - Pour une expérience optimale avec Firebase Cloud Messaging, nous vous recommandons d'activer Google Analytics dans votre projet Firebase et d'ajouter le SDK Firebase pour Google Analytics à votre application. Vous pouvez sélectionner la bibliothèque sans collecte de l'IDFA ou avec collecte de l'IDFA. Consultez nos questions fréquentes sur la dernière organisation des modules dans le Google Analytics pour le SDK Firebase.
- Lorsque vous avez terminé, Xcode commence à résoudre et à télécharger automatiquement vos dépendances en arrière-plan.
https://github.com/firebase/firebase-ios-sdk.git
Importer votre clé d'authentification APNs
Importez votre clé d'authentification APNs dans Firebase. Si vous ne possédez pas encore de clé d'authentification APNs, veillez à en créer une dans le Centre des membres Apple Developer.
-
Dans votre projet de la console Firebase, sélectionnez l'icône en forme de roue dentée, puis Paramètres du projet et enfin l'onglet Cloud Messaging.
-
Dans Clé d'authentification APNs sous Configuration de l'application iOS, cliquez sur le bouton Importer.
-
Accédez à l'emplacement où vous avez enregistré votre clé, sélectionnez-la, puis cliquez sur Ouvrir. Ajoutez l'ID de la clé (disponible dans l' Apple Developer Member Center), puis cliquez sur Importer.
Initialiser Firebase dans votre application
Vous devrez ajouter le code d'initialisation Firebase à votre application. Importez le module Firebase et configurez une instance partagée comme indiqué :
- Importez le module
FirebaseCore
dans votreUIApplicationDelegate
, ainsi que tous les autres modules Firebase utilisés par le délégué de votre application. Par exemple, pour utiliser Cloud Firestore et 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; // ...
- Configurez une instance partagée
FirebaseApp
dans la méthodeapplication(_:didFinishLaunchingWithOptions:)
du délégué de votre application :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];
- Si vous utilisez SwiftUI, vous devez créer un délégué d'application et l'associer à votre structure
App
viaUIApplicationDelegateAdaptor
ouNSApplicationDelegateAdaptor
. Vous devez également désactiver le swizzling du délégué d'application. Pour en savoir plus, consultez les instructions SwiftUI.SwiftUI
@main struct YourApp: App { // register app delegate for Firebase setup @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate var body: some Scene { WindowGroup { NavigationView { ContentView() } } } }
S'inscrire aux notifications à distance
Au démarrage ou au point souhaité du flux de votre application, enregistrez votre application pour les notifications à distance. AppelezregisterForRemoteNotifications
comme indiqué :
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];
Abonner l'application cliente à un sujet
Les applications clientes peuvent s'abonner à n'importe quel sujet existant ou en créer un. Lorsqu'une application cliente s'abonne à un nouveau nom de sujet (qui n'existe pas encore pour votre projet Firebase), un sujet portant ce nom est créé dans FCM, et tout client peut ensuite s'y abonner.
Pour vous abonner à un sujet, appelez la méthode d'abonnement à partir du thread principal de votre application (FCM n'est pas thread-safe). Si la demande d'abonnement échoue initialement, FCM réessaie automatiquement. Dans les cas où l'abonnement ne peut pas être finalisé, il génère une erreur que vous pouvez intercepter dans un gestionnaire d'achèvement, comme indiqué ci-dessous :
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"); }];
Cet appel effectue une requête asynchrone au backend FCM et abonne le client au sujet donné. Avant d'appeler subscribeToTopic:topic
, assurez-vous que l'instance de l'application cliente a déjà reçu un jeton d'enregistrement via le rappel didReceiveRegistrationToken
.
Chaque fois que l'application démarre, FCM s'assure que tous les thèmes demandés ont été souscrits. Pour vous désabonner, appelez unsubscribeFromTopic:topic
. FCM se désabonne du thème en arrière-plan.
Recevoir et traiter les messages de sujets
FCM distribue les messages thématiques de la même manière que les autres messages en aval.
Implémentez application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
comme indiqué ci-dessous :
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); }
Créer des demandes d'envoi
Une fois que vous avez créé un sujet, soit en abonnant des instances d'application cliente au sujet côté client, soit via l'API serveur, vous pouvez envoyer des messages au sujet. Si vous créez des requêtes d'envoi pour FCM pour la première fois, consultez le guide sur votre environnement de serveur et FCM pour obtenir des informations importantes sur le contexte et la configuration.
Dans votre logique d'envoi sur le backend, spécifiez le nom du thème souhaité, comme indiqué :
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)
Go
// 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"
}
}
}
Commande 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
Pour envoyer un message à une combinaison de sujets, spécifiez une condition, qui est une expression booléenne spécifiant les sujets cibles. Par exemple, la condition suivante enverra des messages aux appareils abonnés à TopicA
et à TopicB
ou TopicC
:
"'TopicA' in topics && ('TopicB' in topics || 'TopicC' in topics)"
FCM évalue d'abord les conditions entre parenthèses, puis l'expression de gauche à droite. Dans l'expression ci-dessus, un utilisateur abonné à un seul sujet ne reçoit pas le message. De même, un utilisateur qui n'est pas abonné à TopicA
ne reçoit pas le message. Les combinaisons suivantes reçoivent le badge :
TopicA
etTopicB
TopicA
etTopicC
Vous pouvez inclure jusqu'à cinq thèmes dans votre expression conditionnelle.
Pour envoyer à une condition :
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)
Go
// 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",
}
}
}
Commande 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
Étapes suivantes
- Vous pouvez utiliser votre serveur pour abonner des instances d'application cliente à des thèmes et effectuer d'autres tâches de gestion. Consultez Gérer les abonnements aux thèmes sur le serveur.