| 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 ứng dụng khách trên nền tảng Apple (như iOS) để bạn có thể gửi thông báo một cách đáng tin cậy.
Đối với ứng dụng khách trên 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 của 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 thay đổi phương thức ở hai lĩnh vực chính: liên kết mã thông báo APNs
với Mã cài đặt Firebase
hoặc mã thông báo đăng ký FCM và thu thập dữ liệu Analytics trong quá trình xử lý
lệnh gọi lại thông báo xuôi dòng.
Nhà phát triển không muốn sử dụng phương thức swizzling 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à tắt phương thức swizzling.
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 dành cho nhà phát triển của Apple.
-
Trong bảng điều khiển Firebase, hãy chuyển đến
Settings > General (Cài đặt > Cài đặt chung). Sau đó, hãy nhấp vào thẻ Cloud Messaging (Giải pháp gửi thông báo qua đám mây). - Trong phần APNs authentication key (Khoá xác thực APNs) ở mục iOS app configuration (Cấu hình ứng dụng iOS), hãy nhấp vào Upload (Tải lên) để tải khoá xác thực phát triển, hoặc khoá xác thực sản xuất, hoặc cả hai lên. Bạn phải có ít nhất một khoá.
- Duyệt đến vị trí bạn đã lưu khoá, chọn khoá đó rồi nhấp vào Open. Thêm mã khoá cho khoá (có trong Trung tâm thành viên dành cho nhà phát triển của Apple) rồi nhấp vào Upload.
Đăng ký nhận thông báo từ xa
Khi khởi động hoặc tại điểm mong muốn trong luồng ứ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ý thực thể ứng dụng với FCM và trả về Mã cài đặt Firebase (FID) cho thực thể ứ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 mục tiêu đến bất kỳ thực thể cụ thể nào của ứng dụng.
Tương tự như cách các nền tảng 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 FID để nhắm mục tiêu thông báo. SDK
FCM phân phối FID bằng phương thức FIRMessagingDelegate's
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 truy xuất và tải FID lên thường xuyên vì FID
có thể thay đổi sau lần khởi động ban đầu.
Bật tính năng đăng ký bằng Mã cài đặt Firebase
Để bật tính năng đăng ký thực thể ứng dụng với FCM bằng
Mã cài đặt Firebase (FID),
hãy thêm cờ siêu dữ liệu sau vào tệp Info.plist file, không phải
tệp GoogleService-Info.plist file:
FirebaseMessagingInstallationIdEnabled = YES
Đặt uỷ quyền thông báo
Để nhận FID, hãy triển khai giao thức uỷ quyền thông báo
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 thông báo
, thì 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 thực thể ứng dụng được nhắm mục tiêu bằng FID sau khi đă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 đã gửi FID gần đây, hãy gửi FID đó đến máy chủ ứng dụng.
- Nếu gói thuê bao 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ắt tính năng tự động khởi chạy
Nếu bạn đã tắt tính năng tự động khởi chạy, 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 quá trình đăng ký và phân phối FID thông qua
messaging:didReceiveRegistration: phương thức:
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 phương thức swizzling: liên kết mã thông báo APNs và FID
Nếu bạn đã tắt tính năng thay đổi phương thức hoặc đang tạo ứng dụng SwiftUI, bạn phải liên kết rõ ràng mã thông báo APNs 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 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 phương thức swizzling.
Truy cập vào mã thông báo đăng ký (không còn được dùng nữa)
Theo mặc định, SDK FCM sẽ tạo mã thông báo đăng ký cho thực thể ứng dụng khách khi khởi động ứng dụng. 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 mục tiêu đến bất kỳ thực thể cụ thể nào của ứng dụng.
Tương tự như cách các nền tảng 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 messaging:didReceiveRegistrationToken: của FIRMessagingDelegate.
SDK FCM truy xuất mã thông báo mới hoặc hiện có trong lần khởi động ứng dụng ban đầu và
bất cứ khi nào mã thông báo được cập nhật hoặc bị vô hiệu.
Trong mọi trường hợp, SDK FCM sẽ 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 thông báo
Để nhận mã thông báo đăng ký, hãy triển khai giao thức uỷ quyền thông báo
và đặt FIRMessaging's delegate thuộc tính 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 thông báo
, thì 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 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ý mới, hãy gửi mã thông báo đó đến máy chủ ứng dụng.
- Đă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 trực tiếp mã thông báo bằng token(completion:). 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 quá trình làm mới mã thông báo
Để được 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 thông báo. 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 NSNotification có tên là
kFIRMessagingRegistrationTokenRefreshNotification
thay vì cung cấp 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 phương thức swizzling: liên kết mã thông báo APNs và mã thông báo đăng ký
Nếu bạn đã tắt thay đổi phương thức hoặc đang tạo ứng dụng SwiftUI, thì bạn cần liên kết 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 Messaging's
apnsToken:
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 phương thức swizzling được bật.
Ngăn quá trình tự động khởi chạy
Khi quá trình đăng tạo FCM, thư viện sẽ tải dữ liệu về giá trị nhận dạng và cấu hình lên Firebase. Nếu trước tiên bạn muốn nhận được lựa chọn tham gia rõ ràng từ người dùng, thì bạn có thể ngăn quá trình tự động đăng ký tại thời điểm định cấu hình bằng cách tắt FCM. Để thực hiện việc này, hãy thêm 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ẽ tồn tại trong các lần khởi động lại ứng dụng 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 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 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 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 các 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 > Messaging
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 Create your first campaign (Tạo chiến dịch đầu tiên).
Chọn Firebase Notification messages (Thông báo Firebase) rồi chọn Create (Tạo).
Nếu bạn đã tạo chiến dịch trước đó:
Trên thẻ Campaigns (Chiến dịch), hãy chọn New campaign (Chiến dịch mới).
Nhấp vào Notifications (Thông báo).
Nhập nội dung tin nhắn.
Chọn Send test message (Gửi tin nhắn thử nghiệm) trong ngăn bên phải.
Trong trường có nhãn Add a Firebase Installation ID or FCM registration token (Thêm Mã cài đặt Firebase hoặc mã thông báo đăng ký), hãy nhập mã thông báo đăng ký.
Chọn Test (Kiểm thử).
Sau khi bạn chọn Test (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.
Để xem thông tin chi tiết về việc phân phối thông báo đến ứng dụng của bạn, hãy chuyển đến trang tổng quan DevOps & Engagement > Messaging > Reports dashboard trong bảng điều khiển Firebase. Trang tổng quan này ghi lại số lượng thông báo được gửi và mở trên các 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 các ứng dụng Android.
Các bước tiếp theo
Sau khi bạn hoàn tất các bước thiết lập, sau đây là một số lựa chọn để tiếp tục sử dụng với FCM cho các nền tảng Apple: