Hướng dẫn này mô tả cách thiết lập Firebase Cloud Messaging trong ứng dụng di động và ứng dụng web để bạn có thể nhận tin nhắn một cách đáng tin cậy.
Sau khi được cài đặt trên một thiết bị, ứng dụng khách của bạn có thể nhận tin nhắn thông qua giao diện APN FCM. Bạn có thể bắt đầu gửi thông báo ngay lập tức đến các phân khúc người dùng bằng Trình soạn thông báo hoặc các thông báo được tạo trên máy chủ ứng dụng của bạn.
Xử lý thông báo cảnh báo
FCM gửi tất cả thông báo nhắm đến các ứng dụng của Apple thông qua APNs. Để tìm hiểu thêm về cách nhận thông báo APNs bằng UNUserNotificationCenter
, hãy xem tài liệu của Apple về Xử lý thông báo và các hành động liên quan đến thông báo.
Bạn phải đặt uỷ quyền UNUserNotificationCenter và triển khai các phương thức uỷ quyền thích hợp để nhận thông báo hiển thị từ FCM.
Swift
extension AppDelegate: UNUserNotificationCenterDelegate {
// 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
return [[.alert, .sound]]
}
func userNotificationCenter(_ center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse) async {
let userInfo = response.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)
}
}
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(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionAlert);
}
// Handle notification messages after display notification is tapped by the user.
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)response
withCompletionHandler:(void(^)(void))completionHandler {
NSDictionary *userInfo = response.notification.request.content.userInfo;
if (userInfo[kGCMMessageIDKey]) {
NSLog(@"Message ID: %@", userInfo[kGCMMessageIDKey]);
}
// With swizzling disabled you must let Messaging know about the message, for Analytics
// [[FIRMessaging messaging] appDidReceiveMessage:userInfo];
// Print full message.
NSLog(@"%@", userInfo);
completionHandler();
}
Nếu bạn muốn thêm các thao tác tuỳ chỉnh vào thông báo, hãy đặt tham số click_action
trong tải trọng thông báo.
Sử dụng giá trị mà bạn sẽ dùng cho khoá category
trong tải trọng APNs.
Bạn phải đăng ký các thao tác tuỳ chỉnh thì mới có thể sử dụng. Để biết thêm thông tin, hãy xem Hướng dẫn lập trình thông báo cục bộ và từ xa của Apple.
Để biết thông tin chi tiết về việc gửi tin nhắn đến ứng dụng của bạn, hãy xem FCM trang tổng quan báo cáo. Trang tổng quan này ghi lại số lượng tin nhắn đã gửi và mở trên các thiết bị Apple và Android, cùng với dữ liệu về "lượt hiển thị" (thông báo mà người dùng nhìn thấy) cho các ứng dụng Android.
Xử lý thông báo đẩy im lặng
Khi gửi thông báo bằng khoá content-available
(tương đương với content-available
của APNs), thông báo sẽ được gửi dưới dạng thông báo im lặng, đánh thức ứng dụng của bạn ở chế độ nền cho các tác vụ như làm mới dữ liệu nền.
Không giống như thông báo trên nền trước, bạn phải xử lý các thông báo này bằng phương thức application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
.
Triển khai application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
như minh hoạ:
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);
}
Các nền tảng của Apple không đảm bảo việc gửi thông báo ở chế độ nền. Để tìm hiểu về các điều kiện có thể khiến thông báo ở chế độ nền không gửi được, hãy xem tài liệu của Apple về Đẩy bản cập nhật ở chế độ nền đến ứng dụng của bạn.
Diễn giải tải trọng thông báo
Tải trọng của thông báo là một từ điển gồm các khoá và giá trị. Thông báo được gửi qua APNs có định dạng tải trọng APNs như sau:
{
"aps" : {
"alert" : {
"body" : "great match!",
"title" : "Portugal vs. Denmark",
},
"badge" : 1,
},
"customKey" : "customValue"
}
Xử lý thông báo khi tắt tính năng thay thế phương thức
Theo mặc định, nếu bạn chỉ định lớp uỷ quyền ứng dụng của ứng dụng cho các thuộc tính uỷ quyền UNUserNotificationCenter
và Messaging
, thì FCM sẽ hoán đổi lớp uỷ quyền ứng dụng để tự động liên kết mã thông báo FCM với mã thông báo APNs của thiết bị và truyền các sự kiện đã nhận được thông báo đến Analytics. Nếu tắt rõ ràng tính năng thay thế phương thức, nếu đang tạo một ứng dụng SwiftUI hoặc nếu sử dụng một lớp riêng cho một trong hai uỷ quyền, bạn sẽ cần thực hiện cả hai tác vụ này theo cách thủ công.
Để liên kết mã thông báo FCM với mã thông báo APNs của thiết bị, hãy truyền mã thông báo APNs đến lớp Messaging
trong trình xử lý làm mới mã thông báo của uỷ quyền ứng dụng bằng cách sử dụng thuộc tính 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;
}
Để truyền thông tin nhận thông báo đến Analytics, hãy sử dụng phương thức 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);
}