| 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 (như iOS) để bạn có thể gửi tin nhắn một cách đáng tin cậy.
Đối với ứng dụng khách của Apple, bạn có thể nhận tải trọng thông báo và dữ liệu lên đến 4096 byte qua giao diện Firebase Cloud Messaging APN.
Để viết mã ứng dụng bằng Objective-C hoặc Swift, bạn nên sử dụng FIRMessaging API. Ví dụ về hướng dẫn 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 việc thay đổi phương thức trong hai khía cạnh chính: liên kết mã thông báo APN với Mã cài đặt Firebase 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 tính năng swizzling có thể tắt tính năng này bằng cách thêm cờ FirebaseAppDelegateProxyEnabled vào tệp Info.plist của ứng dụng và đặt giá trị boolean là NO. Các phần liên quan trong hướng dẫn cung cấp các ví dụ về mã, cả khi bật và không bật tính năng thay đổi phương thức.
Tải khoá xác thực APNs lên
Tải khoá xác thực APN lên Firebase. Nếu bạn chưa có khoá xác thực APN, hãy nhớ tạo một khoá trong Trung tâm thành viên dành cho nhà phát triển của 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 (Gửi thông báo qua đám mây). - Trong phần Khoá xác thực APN trong 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 hoặc khoá xác thực chính thức lên, hoặc cả hai. Bạn phải cung cấp ít nhất một biểu trưng.
- Duyệt đến vị trí bạn đã lưu khoá, chọn khoá đó rồi nhấp vào Open (Mở). Thêm mã khoá cho khoá (có trong Apple Developer Member Center) 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 thời điểm mong muốn trong quy trình của ứ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ã 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ã 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ị APN, FID này cho phép bạn gửi thông báo được nhắm mục tiêu đế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 cung cấp mã thông báo thiết bị APN khi khởi động ứng dụng, FCM cung cấp FID để nhắm mục tiêu thông báo. SDK FCM cung cấp FID bằng phương thức
messaging:didReceiveRegistration: của FIRMessagingDelegate, 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 truy xuất và tải FID lên thường xuyên vì FID có thể xoay vòng sau lần khởi động đầu tiên.
Bật tính năng đăng ký bằng Mã cài đặt Firebase
Để cho phép đăng ký thực thể ứng dụng của bạn với FCM bằng cách sử dụng
Mã 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 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 đối tượng uỷ quyền của ứng dụng tuân thủ giao thức uỷ quyền nhắn tin, thì bạn có thể đặt đối tượng 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 mục tiêu 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ủ hoặc mới gửi FID gần đây, hãy gửi FID đến máy chủ ứng dụng.
- Nếu gói thuê bao là mới hoặc người dùng đã cài đặt lại ứng dụng, hãy đăng ký FID cho 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 tự động khởi chạy 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ý
thực thể ứ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 việc đăng ký và phân phố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 swizzling: liên kết mã thông báo APN và FID của bạn
Nếu đã tắt tính năng thay đổi phương thức hoặc đang xây dựng ứng dụng SwiftUI,
bạn phải liên kết rõ ràng mã thông báo APN với Mã cài đặt Firebase (FID). Triển khai phương thức application(_:didRegisterForRemoteNotificationsWithDeviceToken:) để truy xuất mã thông báo APN, 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ách sử dụng các phương thức tương tự như khi bật tính năng swizzling.
Truy cập vào mã thông báo đăng ký (không dùng nữa)
Theo mặc định, SDK FCM sẽ tạo một mã thông báo đăng ký 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ị APN, mã thông báo này cho phép bạn gửi thông báo nhắm mục tiêu đế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 cung cấp mã thông báo thiết bị APN 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 messaging:didReceiveRegistrationToken: của FIRMessagingDelegate.
SDK FCM truy xuất mã thông báo mới hoặc mã thông báo hiện có trong lần khởi chạy ứng dụng đầu tiên và
bất cứ khi nào mã thông báo được cập nhật hoặc mất hiệu lực.
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 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 đối tượng uỷ quyền của ứng dụng tuân thủ giao thức uỷ quyền nhắn tin, thì bạn có thể đặt đối tượng 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 phân phối thông 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ã mới, hãy gửi mã đó đế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 làm 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:). Lỗi không rỗng sẽ được cung cấp nếu không truy xuất được mã thông bá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 mỗi khi mã thông báo được cập nhật, hãy cung cấp một đối tượng uỷ quyền tuân thủ giao thức uỷ quyền nhắn tin. Ví dụ sau đây đăng ký đại diện và thêm phương thức đại diệ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ể nghe 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 swizzling: liên kết mã thông báo APN và mã thông báo đăng ký
Nếu đã tắt tính năng thay đổi phương thức hoặc đang xây dựng ứng dụng SwiftUI, bạn cần liên kết rõ ràng mã thông báo APN 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 APN, 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 đó 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 swizzling.
Ngăn khởi chạy tự động
Khi một lượt đăng ký FCM được tạo, thư viện sẽ tải giá trị nhận dạng và dữ liệu cấu hình lên Firebase. Nếu muốn người dùng chọn sử dụng một cách rõ ràng trước, bạn có thể ngăn việc tự động đăng ký 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 lệnh gọi thời gian chạy:
Swift
Messaging.messaging().autoInitEnabled = true
Objective-C
[FIRMessaging messaging].autoInitEnabled = YES;
Giá trị này sẽ được giữ lại sau khi ứng dụng khởi động lại.
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 thiết bị Apple, bạn phải thêm một phần mở rộng dịch vụ thông báo. Tiện ích này cho phép 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 định gửi hình ảnh trong thông báo, bạn có thể bỏ qua bước này.
Để thêm tiện ích dịch vụ, hãy thực hiện các nhiệm vụ thiết lập bắt buộc để sửa đổi và trình bày thông báo trong APN, sau đó thêm API trợ giúp tiện ích FCM trong 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 phầ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 của bạn.
Chọn Dịch vụ 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, hãy làm như sau:
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ã 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 được nhắm mục tiêu (có ứng dụng chạy ở 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, hãy chuyển đến trang tổng quan DevOps & Engagement (DevOps và mức độ tương tác) > Messaging (Nhắn tin) > Reports (Báo cáo) trong bảng điều khiển Firebase. Trang tổng quan này ghi lại số lượng tin nhắn được gửi và mở trên thiết bị Apple và thiết bị Android, cùng với dữ liệu về "số lượt hiển thị" (thông báo mà người dùng nhìn thấy) cho ứ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 số các cách sau để tiếp tục sử dụng FCM cho các nền tảng của Apple: