| Wybierz platformę: | iOS+ Android Web Flutter Unity C++ |
Po zainstalowaniu aplikacji klienckiej na urządzeniu może ona odbierać wiadomości przez interfejs FCM APNs. Możesz od razu zacząć wysyłać powiadomienia do segmentów użytkowników za pomocą edytora powiadomień w konsoli Firebase lub wiadomości utworzonych na serwerze aplikacji.
Obsługa powiadomień o alertach
FCM dostarcza wszystkie wiadomości kierowane na aplikacje Apple za pomocą APNs. Więcej informacji o otrzymywaniu powiadomień APNs za pomocą interfejsu UNUserNotificationCenter znajdziesz w dokumentacji Apple na temat obsługi powiadomień i działań z nimi związanych.
Aby otrzymywać powiadomienia wyświetlane z usługi FCM, musisz ustawić delegata UNUserNotificationCenter i wdrożyć odpowiednie metody delegata.
Swift
// Receive displayed notifications for iOS 10+ devices.
func userNotificationCenter(_ center: UNUserNotificationCenter,
willPresent notification: UNNotification) async
-> UNNotificationPresentationOptions {
let userInfo = notification.request.content.userInfo
// With swizzling disabled you must let Messaging know about the message, for Analytics
// Messaging.messaging().appDidReceiveMessage(userInfo)
// ...
// Print full message.
print(userInfo)
// Change this to your preferred presentation option
// Note: UNNotificationPresentationOptions.alert has been deprecated.
return [.list, .banner, .sound]
}
func userNotificationCenter(_ center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse) async {
let userInfo = response.notification.request.content.userInfo
// ...
// Print full message.
print(userInfo)
}
Objective-C
// Receive displayed notifications for iOS 10+ devices.
// Handle incoming notification messages while app is in the foreground.
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
willPresentNotification:(UNNotification *)notification
withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
NSDictionary *userInfo = notification.request.content.userInfo;
// With swizzling disabled you must let Messaging know about the message, for Analytics
// [[FIRMessaging messaging] appDidReceiveMessage:userInfo];
// Print full message.
NSLog(@"%@", userInfo);
// Change this to your preferred presentation option
completionHandler(UNNotificationPresentationOptionList |
UNNotificationPresentationOptionBanner |
UNNotificationPresentationOptionSound);
}
- (void)messaging:(FIRMessaging *)messaging didReceiveRegistrationToken:(NSString *)fcmToken {
NSLog(@"FCM registration token: %@", fcmToken);
// Notify about received token.
NSDictionary *dataDict = [NSDictionary dictionaryWithObject:fcmToken forKey:@"token"];
[[NSNotificationCenter defaultCenter] postNotificationName:
@"FCMToken" object:nil userInfo:dataDict];
// TODO: If necessary send token to application server.
// Note: This callback is fired at each app startup and whenever a new token is generated.
}
- (void)logFCMToken {
NSString *fcmToken = [FIRMessaging messaging].FCMToken;
NSLog(@"Local FCM registration token: %@", fcmToken);
NSString* displayToken = [NSString stringWithFormat:@"Logged FCM token: %@", fcmToken];
[[FIRMessaging messaging] tokenWithCompletion:^(NSString * _Nullable token, NSError * _Nullable error) {
if (error != nil) {
NSLog(@"Error fetching the remote FCM registration token: %@", error);
} else {
NSLog(@"Remote FCM registration token: %@", token);
NSString* message =
[NSString stringWithFormat:@"FCM registration token: %@", token];
// display message
NSLog(@"%@", message);
}
}];
NSLog(@"%@", displayToken);
}
- (void)subsribeToTopic {
[[FIRMessaging messaging] subscribeToTopic:@"weather"
completion:^(NSError * _Nullable error) {
NSLog(@"Subscribed to weather topic");
}];
}
@end
Jeśli chcesz dodać do powiadomień działania niestandardowe, ustaw parametr click_action
w ładunku powiadomienia.
Użyj wartości, której używasz w przypadku klucza category w ładunku APNs.
Aby można było korzystać z działań niestandardowych, należy je zarejestrować. Więcej informacji znajdziesz w przewodniku po programowaniu powiadomień lokalnych i zdalnych firmy Apple.
Aby uzyskać wgląd w dostarczanie wiadomości do aplikacji, otwórz panel DevOps i zaangażowanie > Wiadomości > Raporty w Firebase konsoli. Ten panel rejestruje liczbę wysłanych i otwartych wiadomości na urządzeniach z Androidem i Apple, a także dane dotyczące „wyświetleń” (powiadomień widzianych przez użytkowników) w przypadku aplikacji na Androida.
Obsługa wyciszonych powiadomień push
Wysyłając wiadomości za pomocą klawisza content-available (odpowiednika klawisza content-available w usłudze APNs), będą one dostarczane jako ciche powiadomienia, które wybudzają aplikację w tle w celu wykonania zadań takich jak odświeżanie danych w tle.
W odróżnieniu od powiadomień na pierwszym planie te powiadomienia muszą być obsługiwane za pomocą metody
application(_:didReceiveRemoteNotification:fetchCompletionHandler:).
Wdróż application(_:didReceiveRemoteNotification:fetchCompletionHandler:) w sposób pokazany poniżej:
Swift
@MainActor
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 full message.
print(userInfo)
print("Call exportDeliveryMetricsToBigQuery() from AppDelegate")
Messaging.serviceExtension().exportDeliveryMetricsToBigQuery(withMessageInfo: 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 until 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);
}
Platformy Apple nie gwarantują dostarczania powiadomień w tle. Więcej informacji o warunkach, które mogą powodować niepowodzenie powiadomień w tle, znajdziesz w dokumentacji Apple na temat przesyłania aktualizacji w tle do aplikacji.
Interpretowanie ładunku wiadomości z powiadomieniem
Ładunek wiadomości z powiadomieniami to słownik kluczy i wartości. Wiadomości z powiadomieniami wysyłane przez APNs mają format ładunku APNs:
{
"aps" : {
"alert" : {
"body" : "great match!",
"title" : "Portugal vs. Denmark",
},
"badge" : 1,
},
"customKey" : "customValue"
}
Obsługa wiadomości przy wyłączonej podmianie metody
Domyślnie, jeśli przypiszesz klasę delegata aplikacji do właściwości delegata UNUserNotificationCenter i Messaging, FCM zamieni klasę delegata aplikacji, aby automatycznie powiązać token FCM z tokenem APNs urządzenia i przekazywać zdarzenia odebrania powiadomienia do Analytics. Jeśli jawnie wyłączysz podmianę metod, tworzysz aplikację w SwiftUI lub używasz oddzielnej klasy dla delegata, musisz wykonać obie te czynności ręcznie.
Aby powiązać token FCM z tokenem APNs urządzenia, przekaż token APNs do klasy Messaging w procedurze obsługi odświeżania tokena delegata aplikacji za pomocą właściwości apnsToken.
Swift
func application(_ application: UIApplication,
didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
Messaging.messaging().apnsToken = deviceToken;
}
Objective-C
- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
[FIRMessaging messaging].APNSToken = deviceToken;
}
Aby przekazać informacje o otrzymaniu powiadomienia do Analytics, użyj metody appDidReceiveMessage(_:).
Swift
func userNotificationCenter(_ center: UNUserNotificationCenter,
willPresent notification: UNNotification,
withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
let userInfo = notification.request.content.userInfo
Messaging.messaging().appDidReceiveMessage(userInfo)
// Change this to your preferred presentation option
completionHandler([[.alert, .sound]])
}
func userNotificationCenter(_ center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler: @escaping () -> Void) {
let userInfo = response.notification.request.content.userInfo
Messaging.messaging().appDidReceiveMessage(userInfo)
completionHandler()
}
func application(_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable : Any],
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
Messaging.messaging().appDidReceiveMessage(userInfo)
completionHandler(.noData)
}
Objective-C
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
willPresentNotification:(UNNotification *)notification
withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
NSDictionary *userInfo = notification.request.content.userInfo;
[[FIRMessaging messaging] appDidReceiveMessage:userInfo];
// Change this to your preferred presentation option
completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionAlert);
}
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)response
withCompletionHandler:(void(^)(void))completionHandler {
NSDictionary *userInfo = response.notification.request.content.userInfo;
[[FIRMessaging messaging] appDidReceiveMessage:userInfo];
completionHandler();
}
- (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler {
[[FIRMessaging messaging] appDidReceiveMessage:userInfo];
completionHandler(UIBackgroundFetchResultNoData);
}