| Chọn nền tảng: | iOS+ Android Web Flutter Unity C++ |
Hướng dẫn này mô tả cách bắt đầu sử dụng Firebase Cloud Messaging trong các ứng dụng khách trên nền tảng Apple (chẳng hạn như iOS) để bạn có thể gửi tin nhắn một cách đáng tin cậy.
Đối với các ứng dụng khách của Apple, bạn có thể nhận thông báo và tải trọng dữ liệu lên đến 4096 byte thông qua giao diện APNs Firebase Cloud Messaging.
Để viết mã ứng dụng khách bằng Objective-C hoặc Swift, bạn nên sử dụng API FIRMessaging. Ví dụ bắt đầu nhanh cung cấp mã mẫu cho cả hai ngôn ngữ.
Trước khi bắt đầu, hãy thêm Firebase vào dự án Apple.
Thay đổi phương thức trong Firebase Cloud Messaging
SDK FCM thực hiện hoán đổi phương thức ở 2 khu vực chính: ánh xạ mã thông báo APNs của bạn với Firebase Installation ID hoặc mã thông báo đăng ký FCM và thu thập dữ liệu phân tích trong quá trình xử lý lệnh gọi lại thông báo xuôi dòng.
Những nhà phát triển không muốn sử dụng phương thức thay thế có thể tắt phương thức này bằng cách thêm cờ FirebaseAppDelegateProxyEnabled vào tệp Info.plist của ứng dụng và đặt cờ này thành giá trị boolean NO. Các phần liên quan của hướng dẫn cung cấp ví dụ về mã, cả khi đã bật và chưa bật tính năng thay thế phương thức.
Tải khoá xác thực APNs lên
Tải khoá xác thực APNs lên Firebase. Nếu bạn chưa có khoá xác thực APNs, hãy nhớ tạo một khoá trong Trung tâm thành viên của nhà phát triển Apple.
-
Trong bảng điều khiển Firebase, hãy chuyển đến phần
Cài đặt > Chung. Sau đó, hãy nhấp vào thẻ Cloud Messaging. - Trong khoá xác thực APNs trong mục Cấu hình ứng dụng iOS, hãy nhấp vào Tải lên để tải khoá xác thực phát triển, khoá xác thực sản xuất hoặc cả hai. Bạn phải cung cấp ít nhất một ảnh chụp màn hình.
- Duyệt đến vị trí mà bạn đã lưu khoá, chọn khoá đó rồi nhấp vào Mở. Thêm mã khoá cho khoá (có trong Trung tâm thành viên của nhà phát triển Apple) rồi nhấp vào Tải lên.
Đăng ký nhận thông báo từ xa
Khi khởi động hoặc tại điểm mong muốn trong quy trình ứng dụng, hãy đăng ký ứng dụng của bạn để nhận thông báo từ xa. GọiregisterForRemoteNotifications như minh hoạ:
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];
Truy cập vào Mã nhận dạng lượt cài đặt Firebase
Theo mặc định, SDK FCM sẽ đăng ký phiên bản ứng dụng với FCM và trả về một Mã nhận dạng lượt cài đặt Firebase (FID) cho phiên bản ứng dụng khách khi khởi chạy ứng dụng. Tương tự như mã thông báo thiết bị APNs, FID này cho phép bạn gửi thông báo nhắm đến bất kỳ phiên bản cụ thể nào của ứng dụng.
Tương tự như cách các nền tảng của Apple thường phân phối mã thông báo thiết bị APNs khi khởi động ứng dụng, FCM cung cấp một FID để nhắm đến thông báo. SDK FCM sẽ phân phối FID bằng phương thức FIRMessagingDelegate
messaging:didReceiveRegistration:, tự động theo dõi các thay đổi về FID và gọi phương thức bằng một FID mới khi phát hiện thấy thay đổi.
Bạn nên thường xuyên truy xuất và tải FID lên vì FID có thể xoay vòng sau lần khởi động ban đầu.
Cho phép đăng ký bằng Mã nhận dạng lượt cài đặt Firebase
Để cho phép đăng ký phiên bản ứng dụng của bạn với FCM bằng
Mã nhận dạng lượt cài đặt Firebase (FID), hãy thêm cờ siêu dữ liệu sau vào tệp Info.plist, chứ không phải tệp GoogleService-Info.plist:
FirebaseMessagingInstallationIdEnabled = YES
Đặt người uỷ quyền nhắn tin
Để nhận FID, hãy triển khai giao thức uỷ quyền nhắn tin và đặt thuộc tính delegate của FIRMessaging sau khi gọi [FIRApp configure].
Ví dụ: nếu uỷ quyền ứng dụng của bạn tuân thủ giao thức uỷ quyền nhắn tin, bạn có thể đặt uỷ quyền trên application:didFinishLaunchingWithOptions: thành chính nó.
Swift
Messaging.messaging().delegate = self
Objective-C
[FIRMessaging messaging].delegate = self;
Triển khai phương thức didReceiveRegistration
Các phiên bản ứng dụng được nhắm đến bằng FID sau khi quá trình đăng ký hoàn tất.
Để nhận FID khi đăng ký, hãy triển khai phương thức
messaging:didReceiveRegistration:.
Phương thức này thường được gọi một lần cho mỗi lần khởi động ứng dụng bằng FID. Khi phương thức này được gọi, bạn có thể thực hiện các thao tác sau:
- Nếu bạn chưa gửi FID đến máy chủ của mình hoặc đã gửi FID gần đây, hãy gửi FID đến máy chủ ứng dụng của bạn.
- Nếu gói thuê bao là gói mới hoặc người dùng cài đặt lại ứng dụng, hãy đăng ký FID vào các chủ đề.
Swift
func messaging(_ messaging: Messaging, didReceiveRegistration installationId: String?) { print("Firebase Installation ID: \(String(describing: installationId))") // Note: This callback is fired at each app startup. if let installationId = installationId { // Send the Firebase Installation ID to your app server. sendRegistrationToServer(installationId) } }
Objective-C
- (void)messaging:(FIRMessaging *)messaging didReceiveRegistration:(nullable NSString *)installationId { NSLog(@"Firebase Installation ID: %@", installationId); // Note: This callback is fired at each app startup. if (installationId != nil) { // Send the Firebase Installation ID to your app server. [self sendRegistrationToServer:installationId]; } }
Đăng ký theo cách thủ công khi tính năng khởi tạo tự động bị tắt
Nếu bạn đã tắt tính năng tự động khởi chạy, thì SDK FCM sẽ không tự động đăng ký phiên bản ứng dụng với FCM khi khởi động ứng dụng. Bạn phải gọi register khi khởi động ứng dụng để kích hoạt quy trình đăng ký và gửi FID thông qua phương thức
messaging:didReceiveRegistration::
Swift
// Trigger manual registration if auto-initialization is turned off. Messaging.messaging().register { error in if let error = error { // Handle the error print("Failed registering: \(error)") return } // Registration was successful. FID is delivered through the messaging:didReceiveRegistration: method. print("Successfully registered.") }
Objective-C
// Trigger manual registration if auto-initialization is turned off. [[FIRMessaging messaging] registerWithCompletion:^(NSError * _Nullable error) { if (error) { // Handle the error NSLog(@"Failed registering: %@", error); return; } // Registration was successful. FID is delivered through the messaging:didReceiveRegistration: method. NSLog(@"Successfully registered."); }];
Đã tắt tính năng thay thế phương thức: ánh xạ mã thông báo APNs và FID
Nếu đã tắt tính năng hoán đổi phương thức hoặc đang tạo một ứng dụng SwiftUI, thì bạn phải ánh xạ rõ ràng mã thông báo APNs với Mã nhận dạng lượt cài đặt Firebase (FID). Triển khai phương thức application(_:didRegisterForRemoteNotificationsWithDeviceToken:) để truy xuất mã thông báo APNs, sau đó đặt thuộc tính apnsToken của Messaging:
Swift
func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { Messaging.messaging().apnsToken = deviceToken }
Objective-C
// With "FirebaseAppDelegateProxyEnabled": NO - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { [FIRMessaging messaging].APNSToken = deviceToken; }
Sau khi đăng ký FID, bạn có thể truy cập vào FID và theo dõi các sự kiện làm mới bằng các phương thức tương tự như khi bật tính năng thay thế.
Truy cập vào mã thông báo đăng ký
Theo mặc định, SDK FCM sẽ tạo mã thông báo đăng ký cho phiên bản ứng dụng khách khi ứng dụng khởi chạy. Tương tự như mã thông báo thiết bị APNs, mã thông báo này cho phép bạn gửi thông báo nhắm đến bất kỳ phiên bản cụ thể nào của ứng dụng.
Tương tự như cách các nền tảng của Apple thường phân phối mã thông báo thiết bị APNs khi khởi động ứng dụng, FCM cung cấp mã thông báo đăng ký thông qua phương thức FIRMessagingDelegate của messaging:didReceiveRegistrationToken:.
SDK FCM truy xuất một mã thông báo mới hoặc hiện có trong lần khởi chạy ứng dụng ban đầu và bất cứ khi nào mã thông báo được cập nhật hoặc không hợp lệ.
Trong mọi trường hợp, FCM SDK đều gọi messaging:didReceiveRegistrationToken: bằng một mã thông báo hợp lệ.
Mã thông báo đăng ký có thể thay đổi khi:
- Ứng dụng được khôi phục trên một thiết bị mới
- Người dùng gỡ cài đặt/cài đặt lại ứng dụng
- Người dùng xoá dữ liệu ứng dụng.
Đặt người uỷ quyền nhắn tin
Để nhận mã thông báo đăng ký, hãy triển khai giao thức uỷ quyền nhắn tin và đặt thuộc tính delegate của FIRMessaging sau khi gọi [FIRApp configure].
Ví dụ: nếu uỷ quyền ứng dụng của bạn tuân thủ giao thức uỷ quyền nhắn tin, bạn có thể đặt uỷ quyền trên application:didFinishLaunchingWithOptions: thành chính nó.
Swift
Messaging.messaging().delegate = self
Objective-C
[FIRMessaging messaging].delegate = self;
Tìm nạp mã thông báo đăng ký hiện tại
Mã thông báo đăng ký được gửi qua phương thức messaging:didReceiveRegistrationToken:. Phương thức này thường được gọi một lần cho mỗi lần khởi động ứng dụng bằng mã thông báo đăng ký. Khi phương thức này được gọi, đây là thời điểm lý tưởng để:
- Nếu mã thông báo đăng ký là mã thông báo mới, hãy gửi mã thông báo đó đến máy chủ ứng dụng của bạn.
- Đăng ký mã thông báo đăng ký cho các chủ đề. Bạn chỉ cần thực hiện việc này đối với các gói thuê bao mới hoặc trong trường hợp người dùng đã cài đặt lại ứng dụng.
Bạn có thể truy xuất mã thông báo trực tiếp bằng cách sử dụng token(completion:). Một lỗi không rỗng sẽ được cung cấp nếu quá trình truy xuất mã thông báo không thành công theo bất kỳ cách nào.
Swift
Messaging.messaging().token { token, error in if let error = error { print("Error fetching remote FCM registration token: \(error)") } else if let token = token { print("Remote instance ID token: \(token)") } }
Objective-C
[[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); } }];
Bạn có thể sử dụng phương thức này bất cứ lúc nào để truy cập vào mã thông báo thay vì lưu trữ mã thông báo.
Theo dõi việc làm mới mã thông báo
Để nhận thông báo bất cứ khi nào mã thông báo được cập nhật, hãy cung cấp một uỷ quyền tuân thủ giao thức uỷ quyền nhắn tin. Ví dụ sau đây đăng ký uỷ quyền và thêm phương thức uỷ quyền thích hợp:
Swift
func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) { print("Firebase registration token: \(String(describing: fcmToken))") // TODO: If necessary send token to application server. // Note: This callback is fired at each app startup and whenever a new token is generated. }
Objective-C
- (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. }
Ngoài ra, bạn có thể theo dõi một NSNotification có tên là kFIRMessagingRegistrationTokenRefreshNotification thay vì cung cấp một phương thức uỷ quyền. Thuộc tính mã thông báo luôn có giá trị mã thông báo hiện tại.
Đã tắt tính năng thay thế: ánh xạ mã thông báo APN và mã thông báo đăng ký
Nếu đã tắt tính năng thay thế phương thức hoặc đang tạo một ứng dụng SwiftUI, bạn cần phải ánh xạ rõ ràng mã thông báo APNs với mã thông báo đăng ký FCM. Triển khai phương thức application(_:didRegisterForRemoteNotificationsWithDeviceToken:) để truy xuất mã thông báo APNs, sau đó đặt thuộc tính apnsToken của Messaging:
Swift
func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { Messaging.messaging().apnsToken = deviceToken }
Objective-C
// With "FirebaseAppDelegateProxyEnabled": NO - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { [FIRMessaging messaging].APNSToken = deviceToken; }
Sau khi mã thông báo đăng ký FCM được tạo, bạn có thể truy cập vào mã thông báo này và theo dõi các sự kiện làm mới bằng các phương thức tương tự như khi bật tính năng thay thế.
Ngăn quá trình khởi chạy tự động
Khi quá trình đăng ký FCM được tạo, thư viện sẽ tải dữ liệu cấu hình và giá trị nhận dạng lên Firebase. Nếu muốn nhận được sự đồng ý rõ ràng của người dùng trước, bạn có thể ngăn việc đăng ký tự động tại thời điểm định cấu hình bằng cách tắt FCM. Để làm việc này, hãy thêm một giá trị siêu dữ liệu vào Info.plist (không phải GoogleService-Info.plist):
FirebaseMessagingAutoInitEnabled = NO
Để bật lại FCM, bạn có thể thực hiện một lệnh gọi thời gian chạy:
Swift
Messaging.messaging().autoInitEnabled = true
Objective-C
[FIRMessaging messaging].autoInitEnabled = YES;
Giá trị này vẫn giữ nguyên khi ứng dụng khởi động lại sau khi được đặt.
Thiết lập tiện ích dịch vụ thông báo
Để gửi thông báo có hình ảnh đến các thiết bị Apple, bạn phải thêm một tiện ích dịch vụ thông báo. Tiện ích này cho phép các thiết bị hiển thị hình ảnh được phân phối trong tải trọng thông báo. Nếu không có ý định gửi hình ảnh trong thông báo, bạn có thể bỏ qua bước này.
Để thêm một tiện ích dịch vụ, hãy thực hiện các tác vụ thiết lập bắt buộc để sửa đổi và trình bày thông báo trong APNs, sau đó thêm API trợ giúp tiện ích FCM vào NotificationService.m.
Cụ thể, thay vì hoàn tất lệnh gọi lại bằng self.contentHandler(self.bestAttemptContent);, hãy hoàn tất lệnh gọi lại bằng FIRMessaging
extensionHelper như minh hoạ:
@interface NotificationService () <NSURLSessionDelegate>
@property(nonatomic) void (^contentHandler)(UNNotificationContent *contentToDeliver);
@property(nonatomic) UNMutableNotificationContent *bestAttemptContent;
@end
@implementation NotificationService
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
self.contentHandler = contentHandler;
self.bestAttemptContent = [request.content mutableCopy];
// Modify the notification content here as you want
self.bestAttemptContent.title = [NSString stringWithFormat:@"%@ [modified]",
self.bestAttemptContent.title];
// Call FIRMessaging extension helper API.
[[FIRMessaging extensionHelper] populateNotificationContent:self.bestAttemptContent
withContentHandler:contentHandler];
}
...
Gửi thông báo
Cài đặt và chạy ứng dụng trên thiết bị mục tiêu. Trên thiết bị Apple, hãy chấp nhận yêu cầu cấp quyền nhận thông báo từ xa.
Kiểm tra để đảm bảo ứng dụng đang chạy ở chế độ nền trên thiết bị.
Trong bảng điều khiển Firebase, hãy chuyển đến DevOps & Engagement (DevOps và mức độ tương tác) > Messaging (Nhắn tin)
Tạo một chiến dịch.
Nếu đây là thông báo đầu tiên của bạn:
Chọn Tạo chiến dịch đầu tiên.
Chọn Thông báo của Firebase rồi chọn Tạo.
Nếu trước đây bạn đã tạo chiến dịch:
Trên thẻ Chiến dịch, hãy chọn Chiến dịch mới.
Nhấp vào Thông báo.
Nhập nội dung tin nhắn.
Chọn Gửi tin nhắn thử nghiệm trong ngăn bên phải.
Trong trường có nhãn Thêm mã nhận dạng lượt cài đặt Firebase hoặc mã thông báo đăng ký FCM, hãy nhập mã thông báo đăng ký của bạn.
Chọn Kiểm tra.
Sau khi bạn chọn Kiểm thử, thiết bị khách mục tiêu (với ứng dụng ở chế độ nền) sẽ nhận được thông báo.
Để biết thông tin chi tiết về việc gửi thông báo đến ứng dụng của bạn, hãy chuyển đến trang tổng quan Báo cáo trong phần DevOps và mức độ tương tác > Nhắn tin > Báo cáo trong bảng điều khiển Firebase. Trang tổng quan này ghi lại số lượng thông báo đã gửi và đã mở trên 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.
Các bước tiếp theo
Sau khi hoàn tất các bước thiết lập, bạn có thể chọn một trong những cách sau để tiếp tục sử dụng FCM cho các nền tảng của Apple:
- Gửi tin nhắn đến các thiết bị
- Nhận tin nhắn trong một ứng dụng của Apple
- Gửi thông báo đến các chủ đề