Aby kierować wiadomość na wiele urządzeń, użyj Wiadomości tematyczne. Ten umożliwia wysyłać wiadomość na wiele urządzeń, które wyraziły zgodę na dany temat.
Ten samouczek skupia się na wysyłaniu wiadomości tematycznych z serwera aplikacji za pomocą Admin SDK lub Interfejs API typu REST dla usługi FCM oraz ich odbioru i obsługi w aplikacji Apple. Na tej stronie znajdziesz listę wszystkich kroków niezbędnych do osiągnięcia tego celu, od konfiguracji po weryfikacji. Mogą one obejmować czynności, które zostały już wykonane, jeśli skonfiguruj aplikację kliencką Apple na koncie FCM lub postępuj zgodnie z instrukcjami Wyślij pierwszą wiadomość.
Dodaj Firebase do projektu Apple
Ta sekcja obejmuje zadania, które mogły zostać wykonane, jeśli zostały już włączone z innymi funkcjami Firebase w przypadku Twojej aplikacji. W przypadku usługi FCM Trzeba prześlij klucz uwierzytelniania APNs i zarejestruj się na zdalne powiadomienia.
Wymagania wstępne
Zainstaluj następujące elementy:
- Xcode 15.2 lub nowsza wersja
Sprawdź, czy Twój projekt spełnia te wymagania:
- Twój projekt musi być kierowany na te wersje platformy lub nowsze:
- iOS 13
- macOS 10.15
- tvOS 13
- watchOS 7
- Twój projekt musi być kierowany na te wersje platformy lub nowsze:
skonfigurować fizyczne urządzenie Apple do uruchamiania aplikacji; i wykonaj te zadania:
- Uzyskaj klucz uwierzytelniania Apple Push Notification do swojego Konto dewelopera Apple.
- Włącz powiadomienia push w XCode w sekcji App > (Aplikacja >) Możliwości.
- Zaloguj się w Firebase za pomocą Konto Google.
Jeśli nie masz jeszcze projektu Xcode i chcesz tylko wypróbować Firebase możesz pobrać nasze krótkie wprowadzenia.
Tworzenie projektu Firebase
Zanim dodasz Firebase do swojej aplikacji Apple, musisz utworzyć taką aplikację projekt, aby połączyć się z aplikacją. Odwiedź Więcej informacji o projektach Firebase Projekty Firebase.
Zarejestruj aplikację w Firebase
Aby używać Firebase w swojej aplikacji Apple, musisz ją zarejestrować w projekt Firebase. Rejestracja aplikacji często nazywa się „dodawaniem” aplikacji na w projektach AI.
Otwórz konsolę Firebase.
Na środku strony przeglądu projektu kliknij ikonę iOS+. aby rozpocząć proces konfiguracji.
Jeśli masz już aplikację w projekcie Firebase, kliknij Dodaj aplikację. aby wyświetlić opcje platformy.
W polu identyfikator pakietu wpisz identyfikator pakietu aplikacji.
.(Opcjonalnie) Wpisz inne informacje o aplikacji: Nazwa aplikacji i identyfikator App Store.
Kliknij Zarejestruj aplikację.
Dodaj plik konfiguracji Firebase
Kliknij Download GoogleService-Info.plist, aby otrzymać Firebase Apple plik konfiguracji platform (
GoogleService-Info.plist
).Przenieś plik konfiguracji do katalogu głównego projektu Xcode. Jeśli pojawi się taka prośba, wybierz, aby dodać plik konfiguracyjny do wszystkich środowisk docelowych.
Jeśli masz w projekcie kilka identyfikatorów pakietów, musisz powiązać każdy z nich
Identyfikator zarejestrowanej aplikacji w konsoli Firebase, dzięki czemu każda aplikacja może mieć
własny plik GoogleService-Info.plist
.
Dodaj pakiety SDK Firebase do swojej aplikacji
Użyj menedżera pakietów Swift, aby zainstalować zależności Firebase i nimi zarządzać.
- W Xcode po otwarciu projektu aplikacji przejdź do File > Dodaj pakiety.
- Gdy pojawi się prośba, dodaj repozytorium SDK platform Apple Platform SDK Firebase:
- Wybierz bibliotekę Firebase Cloud Messaging.
- Dodaj flagę
-ObjC
do sekcji Inne flagi łączące w ustawieniach kompilacji celu. - Aby zapewnić optymalne działanie usługi Firebase Cloud Messaging, zalecamy włączam Google Analytics w projekcie Firebase i dodając do aplikacji pakiet SDK Firebase dla Google Analytics. Dostępne opcje wybrać bibliotekę bez zbierania danych IDFA lub z zbieraniem tych danych.
- Po zakończeniu Xcode automatycznie rozpocznie rozpoznawanie i pobieranie lub zależności w tle.
https://github.com/firebase/firebase-ios-sdk.git
Prześlij klucz uwierzytelniania APNs
Prześlij klucz uwierzytelniania APNs do Firebase. Jeśli nie masz jeszcze klucza uwierzytelniania APNs, utwórz go w Apple Developer Member Center
-
W projekcie w konsoli Firebase wybierz ikona koła zębatego, wybierz Ustawienia projektu i wybierz Komunikacja w chmurze.
-
W sekcji Klucz uwierzytelniania APN w sekcji Konfiguracja aplikacji na iOS kliknij przycisk Prześlij Przycisk
-
Przejdź do miejsca, w którym masz zapisany klucz, wybierz go i kliknij Otwórz. Dodaj identyfikator klucza (dostępny w sekcji Apple Developer Member Center) i kliknij Prześlij.
Zainicjuj Firebase w swojej aplikacji
Musisz dodać do swojej aplikacji kod inicjowania Firebase. Importuj moduł Firebase i skonfiguruj współdzieloną instancję, jak pokazano poniżej:
- Zaimportuj moduł
FirebaseCore
doUIApplicationDelegate
, jak i wszelkie inne Moduły Firebase używane przez przedstawiciela aplikacji. Aby na przykład użyć atrybutów Cloud Firestore i 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; // ...
- Skonfiguruj
FirebaseApp
współdzielonej instancji w uprawnieniach przedstawiciela aplikacji Metodaapplication(_:didFinishLaunchingWithOptions:)
: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];
- Jeśli używasz SwiftUI, musisz utworzyć i dołączyć przedstawiciela aplikacji.
do struktury
App
za pomocąUIApplicationDelegateAdaptor
lubNSApplicationDelegateAdaptor
Musisz też wyłączyć przełączanie przekazywania dostępu do aplikacji. Dla: więcej informacji znajdziesz w instrukcjach SwiftUI.SwiftUI
@main struct YourApp: App { // register app delegate for Firebase setup @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate var body: some Scene { WindowGroup { NavigationView { ContentView() } } } }
Zarejestruj się, aby otrzymywać powiadomienia zdalne
Podczas uruchamiania lub w oczekiwanym punkcie procesu aplikacji zarejestrować aplikację do otrzymywania zdalnych powiadomień. Zadzwoń do nasregisterForRemoteNotifications
jak pokazano:
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];
Subskrybowanie tematu w aplikacji klienckiej
Aplikacje klienckie mogą subskrybować dowolny istniejący temat lub utworzyć nowy temat. Gdy aplikacja kliencka subskrybuje nową nazwę tematu (taką, która nie jeszcze nie istnieje dla Twojego projektu Firebase), nowy temat o tej nazwie to utworzona w FCM i każdy klient może ją subskrybować.
Aby zasubskrybować temat, wywołaj metodę subskrypcji z głównego wątku aplikacji (FCM nie jest bezpieczne w wątku). Jeśli początkowo prośba o subskrypcję nie powiedzie się, FCM automatycznie spróbuje ponownie. Jeśli nie można zrealizować subskrypcji, subskrypcja zgłasza błąd, który można wykryć, w module obsługi uzupełniania, jak pokazano poniżej:
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"); }];
To połączenie powoduje
żądanie asynchroniczne do backendu FCM i subskrybuje klienta
na dany temat. Zanim zadzwonisz pod numer subscribeToTopic:topic
, sprawdź, czy
instancja aplikacji klienckiej już otrzymała token rejestracji za pośrednictwem
oddzwanianie: didReceiveRegistrationToken
.
Przy każdym uruchomieniu aplikacji
FCM sprawdza, czy wszystkie żądane tematy zostały zasubskrybowane. Do
anuluj subskrypcję, zadzwoń do: unsubscribeFromTopic:topic
,
i FCM anuluje subskrypcję tematu w tle.
Odbieranie i obsługę wiadomości dotyczących tematów
FCM dostarcza wiadomości tematyczne w taki sam sposób, jak inne wiadomości na kolejnym etapie wiadomości.
Wdróż application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
Jak widać:
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); }
Tworzenie żądań wysyłania
Po utworzeniu tematu przez zasubskrybowanie instancji aplikacji klienckiej po stronie klienta lub w interfejs API serwera, możesz wysyłać komunikaty do temat. Jeśli po raz pierwszy tworzysz prośby o wysłanie próśb do usługi FCM, zobacz przewodnik środowisko serwera i FCM dla najważniejsze informacje i informacje o konfiguracji.
W logice wysyłania w backendzie określ odpowiednią nazwę tematu Jak widać:
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"
}
}
}
Polecenie 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
Aby wysłać wiadomość do kombinacji tematów:
Określ warunek, czyli wyrażenie logiczne, które określa
kierowania na tematy. Na przykład poniższy warunek spowoduje wysłanie wiadomości do
urządzenia z subskrypcją TopicA
oraz TopicB
lub TopicC
:
"'TopicA' in topics && ('TopicB' in topics || 'TopicC' in topics)"
Funkcja FCM najpierw sprawdza warunki w nawiasach, a potem
od lewej do prawej. W powyższym wyrażeniu użytkownik zasubskrybował
każdy z tematów nie otrzyma wiadomości. Podobnie użytkownik, który nie
subskrypcja użytkownika TopicA
nie otrzymuje wiadomości. Takie kombinacje mają
go otrzymać:
TopicA
iTopicB
TopicA
iTopicC
Wyrażenie warunkowe może zawierać maksymalnie 5 tematów.
Aby wysłać do warunku:
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",
}
}
}
Polecenie 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
Dalsze kroki
- Za pomocą serwera możesz subskrybować instancje aplikacji klienckich w tematyce oraz wykonywać inne zadania związane z zarządzaniem. Zobacz Zarządzaj subskrypcjami tematów na serwerze.