Thiết lập ứng dụng Giải pháp gửi thông báo qua đám mây của Firebase trên các nền tảng của Apple

Đối với các ứng dụng khách của Apple, bạn có thể nhận được 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ụ về hướng dẫn nhanh cung cấp mã mẫu cho cả hai ngôn ngữ.

Thay đổi phương thức trong Firebase Cloud Messaging

SDK FCM thực hiện hoán đổi phương thức ở 2 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à ghi lại dữ liệu phân tích trong quá trình xử lý lệnh gọi lại thông báo truyền xuố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 NO (giá trị boolean). 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à không bật tính năng hoán đổi phương thức.

Thêm Firebase vào dự án Apple

Nếu bạn chưa thực hiện, hãy thêm Firebase vào dự án Apple.

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.

  1. Trong dự án của bạn trên bảng điều khiển Firebase, hãy chọn biểu tượng bánh răng, chọn Project Settings (Cài đặt dự án), rồi chọn thẻ Cloud Messaging (Nhắn tin qua đám mây).

  2. Trong phần Khoá xác thực APNs trong Cấu hình ứng dụng iOS, hãy nhấp vào nút Tải lên.

  3. 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ọ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 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:. FCM SDK 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ã 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 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 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 FCM registration token: \(error)")
  } else if let token = token {
    print("FCM registration token: \(token)")
    self.fcmRegTokenMessage.text  = "Remote FCM registration token: \(token)"
  }
}

Objective-C

[[FIRMessaging messaging] tokenWithCompletion:^(NSString *token, NSError *error) {
  if (error != nil) {
    NSLog(@"Error getting FCM registration token: %@", error);
  } else {
    NSLog(@"FCM registration token: %@", token);
    self.fcmRegTokenMessage.text = token;
  }
}];

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))")

  let dataDict: [String: String] = ["token": fcmToken ?? ""]
  NotificationCenter.default.post(
    name: Notification.Name("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.
}

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 hoán đổi: á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 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 hoán đổi.

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

Khi mã thông báo đăng ký FCM được tạo, thư viện sẽ tải mã nhận dạng và dữ liệu cấu hình 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 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. Để 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.

Các bước tiếp theo

Sau khi thiết lập ứng dụng Apple, bạn có thể thêm tính năng xử lý thông báo và các hành vi nâng cao khác vào ứng dụng của mình. Hãy xem các hướng dẫn sau để biết thêm thông tin: