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 ứ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.

  1. 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).
  2. 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á.
  3. 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ọ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ã 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.

Để biết thông tin chi tiết về thời điểm FID được cấp lại và cách theo dõi FID theo cách thủ công, hãy xem bài viết Theo dõi vòng đời của mã cài đặt Firebase.

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

  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 chuyển đến DevOps & Engagement > Messaging

  4. Tạo một chiến dịch.

    • Nếu đây là thông báo đầu tiên của bạn:

      1. Chọn Create your first campaign (Tạo chiến dịch đầu tiên).

      2. 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 đó:

      1. Trên thẻ Campaigns (Chiến dịch), hãy chọn New campaign (Chiến dịch mới).

      2. Nhấp vào Notifications (Thông báo).

  5. Nhập nội dung tin nhắn.

  6. Chọn Send test message (Gửi tin nhắn thử nghiệm) trong ngăn bên phải.

  7. 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ý.

  8. 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: