Bắt đầu sử dụng Giải pháp gửi thông báo qua đám mây của Firebase trong các ứng dụng trên nền tảng Apple

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 thông báo một cách đáng tin cậy.

Đối với các ứng dụng khách trên Apple, bạn có thể nhận tải trọng thông báo và 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ụ 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 thay đổi phương thức ở hai lĩnh vực chính: ánh xạ mã thông báo APNs với 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 thay đổi phương thức 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 cờ này thành NO (giá trị boolean). Các phần liên quan của hướng dẫn cung cấp các đoạn mã ví dụ, cả khi bật và tắ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 APNs lên Firebase. Nếu 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.

  1. Trong dự án của bạn trong bảng điều khiển Firebase, hãy chọn biểu tượng bánh răng, chọn Cài đặt dự án, rồi chọn thẻ Giải pháp gửi thông báo qua đám mây.

  2. Trong phần Khoá xác thực APNs ở mục Cấu hình ứng dụng iOS, hãy nhấp vào nút 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á.

  3. Duyệt đến vị trí 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 dành cho nhà phát triển của 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 thờ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ọi registerForRemoteNotifications 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ã thông báo đăng ký

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 chạy ứ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 được 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 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 bị vô hiệu. Trong mọi trường hợp, SDK FCM đề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 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 nhắn tin , 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ý là 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ý vào các chủ đề. Bạn chỉ cần thực hiện việc này cho các gói đăng ký mới hoặc cho các 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 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 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 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ể nghe 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 tính năng thay đổi phương thức: ánh xạ mã thông báo APNs 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 á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 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 tạo mã thông báo đăng ký FCM, bạn có thể truy cập vào mã thông báo đó và nghe 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 đổi phương thức.

Ngăn quá trình khởi chạy tự động

Khi tạo mã thông báo đăng ký FCM, thư viện sẽ tải dữ liệu nhận dạng và cấu hình lên Firebase. Nếu muốn nhận được lựa chọn tham gia rõ ràng từ người dùng trước tiên, bạn có thể ngăn quá trình tạo mã thông báo 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 vẫn tồn tại trên 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ó kế hoạch 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

  1. 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.
  2. Kiểm tra để đảm bảo ứng dụng đang chạy ở chế độ nền trên thiết bị.
  3. Trong bảng điều khiển Firebase, hãy mở trang Giải pháp gửi thông báo qua đám mây.
  4. Nếu đây là thông báo đầu tiên của bạn, hãy chọn Tạo chiến dịch đầu tiên.
    1. Chọn Thông báo Firebase rồi chọn Tạo.
  5. Nếu không, trên thẻ Chiến dịch, hãy chọn Chiến dịch mới rồi chọn Thông báo.
  6. Nhập nội dung tin nhắn.
  7. Chọn Gửi thông báo thử nghiệm trong ngăn bên phải.
  8. Trong trường có nhãn Thêm mã thông báo đăng ký FCM, hãy nhập mã thông báo đăng ký của bạn.
  9. Chọn Kiểm tra.

Sau khi bạn chọn Kiểm tra, thiết bị khách được nhắm mục tiêu (với ứng dụng ở chế độ nền) sẽ nhận được thông báo.

Để nắm được 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 xem FCM báo cáo trang tổng quan, trang 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à 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ể tham khảo một số lựa chọn để tiếp tục sử dụng FCM cho các nền tảng Apple: