Nhận tin nhắn trong ứng dụng của Apple

Sau khi cài đặt ứng dụng khách trên một thiết bị, ứng dụng đó có thể nhận tin nhắn thông qua giao diện APN FCM. Bạn có thể bắt đầu ngay việc gửi thông báo đến các phân khúc người dùng bằng Trình soạn thông báo hoặc thông báo được tạo trên máy chủ ứng dụng.

Xử lý thông báo cảnh báo

FCM phân phối tất cả thông báo nhắm đến các ứng dụng của Apple thông qua APN. Để tìm hiểu thêm về cách nhận thông báo APN thông qua UNUserNotificationCenter, hãy xem tài liệu của Apple về Xử lý thông báo và các hành động liên quan đến thông báo.

Bạn phải đặt đại diện UNUserNotificationCenter và triển khai các phương thức uỷ quyền thích hợp để nhận thông báo hiển thị từ FCM.

Swift

extension AppDelegate: UNUserNotificationCenterDelegate {
  // Receive displayed notifications for iOS 10 devices.
  func userNotificationCenter(_ center: UNUserNotificationCenter,
                              willPresent notification: UNNotification) async
    -> UNNotificationPresentationOptions {
    let userInfo = notification.request.content.userInfo

    // With swizzling disabled you must let Messaging know about the message, for Analytics
    // Messaging.messaging().appDidReceiveMessage(userInfo)

    // ...

    // Print full message.
    print(userInfo)

    // Change this to your preferred presentation option
    return [[.alert, .sound]]
  }

  func userNotificationCenter(_ center: UNUserNotificationCenter,
                              didReceive response: UNNotificationResponse) async {
    let userInfo = response.notification.request.content.userInfo

    // ...

    // With swizzling disabled you must let Messaging know about the message, for Analytics
    // Messaging.messaging().appDidReceiveMessage(userInfo)

    // Print full message.
    print(userInfo)
  }
}

Objective-C

// Receive displayed notifications for iOS 10 devices.
// Handle incoming notification messages while app is in the foreground.
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
       willPresentNotification:(UNNotification *)notification
         withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
  NSDictionary *userInfo = notification.request.content.userInfo;

  // With swizzling disabled you must let Messaging know about the message, for Analytics
  // [[FIRMessaging messaging] appDidReceiveMessage:userInfo];

  // ...

  // Print full message.
  NSLog(@"%@", userInfo);

  // Change this to your preferred presentation option
  completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionAlert);
}

// Handle notification messages after display notification is tapped by the user.
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)response
         withCompletionHandler:(void(^)(void))completionHandler {
  NSDictionary *userInfo = response.notification.request.content.userInfo;
  if (userInfo[kGCMMessageIDKey]) {
    NSLog(@"Message ID: %@", userInfo[kGCMMessageIDKey]);
  }

  // With swizzling disabled you must let Messaging know about the message, for Analytics
  // [[FIRMessaging messaging] appDidReceiveMessage:userInfo];

  // Print full message.
  NSLog(@"%@", userInfo);

  completionHandler();
}

Nếu bạn muốn thêm hành động tuỳ chỉnh vào thông báo, hãy đặt thông số click_action trong trọng tải thông báo. Sử dụng giá trị mà bạn sẽ sử dụng cho khoá category trong tải trọng APN. Bạn phải đăng ký hành động tuỳ chỉnh trước khi có thể sử dụng. Để biết thêm thông tin, hãy xem Hướng dẫn lập trình thông báo cục bộ và từ xa của Apple.

Để biết 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 trang tổng quan báo cáo FCM. Trang này ghi lại số lượng thông báo đã gửi và mở trên thiết bị Apple và Android, cùng với dữ liệu về "lượt hiển thị" (số thông báo mà người dùng đã xem) cho các ứng dụng Android.

Xử lý thông báo đẩy không có âm thanh

Khi gửi tin nhắn bằng khoá content-available (tương đương với content-available của APN, tin nhắn sẽ được phân phối dưới dạng thông báo không âm thanh, đánh thức ứng dụng của bạn ở chế độ nền cho các tác vụ như làm mới dữ liệu ở chế độ nền. Không giống như thông báo trên nền trước, bạn phải xử lý các thông báo này thông qua phương thức application(_:didReceiveRemoteNotification:fetchCompletionHandler:).

Triển khai application(_:didReceiveRemoteNotification:fetchCompletionHandler:) như sau:

Swift

func application(_ application: UIApplication,
                 didReceiveRemoteNotification userInfo: [AnyHashable: Any]) async
  -> UIBackgroundFetchResult {
  // If you are receiving a notification message while your app is in the background,
  // this callback will not be fired till the user taps on the notification launching the application.
  // TODO: Handle data of notification

  // With swizzling disabled you must let Messaging know about the message, for Analytics
  // Messaging.messaging().appDidReceiveMessage(userInfo)

  // Print message ID.
  if let messageID = userInfo[gcmMessageIDKey] {
    print("Message ID: \(messageID)")
  }

  // Print full message.
  print(userInfo)

  return UIBackgroundFetchResult.newData
}

Objective-C

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
    fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
  // If you are receiving a notification message while your app is in the background,
  // this callback will not be fired till the user taps on the notification launching the application.
  // TODO: Handle data of notification

  // With swizzling disabled you must let Messaging know about the message, for Analytics
  // [[FIRMessaging messaging] appDidReceiveMessage:userInfo];

  // ...

  // Print full message.
  NSLog(@"%@", userInfo);

  completionHandler(UIBackgroundFetchResultNewData);
}

Các nền tảng của Apple không đảm bảo việc phân phối thông báo ở chế độ nền. Để tìm hiểu về các điều kiện có thể khiến thông báo trong nền không hoạt động, hãy xem tài liệu của Apple về Đẩy bản cập nhật trong nền đến ứng dụng.

Diễn giải tải trọng thông báo

Tải trọng của thông báo là một từ điển chứa các khoá và giá trị. Thông báo được gửi qua APN tuân theo định dạng tải trọng APN như sau:

  {
    "aps" : {
      "alert" : {
        "body" : "great match!",
        "title" : "Portugal vs. Denmark",
      },
      "badge" : 1,
    },
    "customKey" : "customValue"
  }

Xử lý các thông báo có tính năng hoán đổi phương thức bị tắt

Theo mặc định, nếu bạn chỉ định lớp uỷ quyền ứng dụng của ứng dụng cho các thuộc tính uỷ quyền UNUserNotificationCenterMessaging, FCM sẽ hoán đổi lớp uỷ quyền ứng dụng để tự động liên kết mã thông báo FCM với mã thông báo APN của thiết bị và chuyển các sự kiện nhận thông báo đến Analytics. Nếu tắt rõ ràng tính năng hoán đổi phương thức, nếu đang tạo ứng dụng SwiftUI hoặc nếu sử dụng một lớp riêng cho một trong hai trình uỷ quyền, bạn sẽ cần thực hiện cả hai thao tác này theo cách thủ công.

Để liên kết mã thông báo FCM với mã thông báo APN của thiết bị, hãy truyền mã thông báo APN đến lớp Messaging trong trình xử lý làm mới mã thông báo của uỷ quyền ứng dụng thông qua thuộc tính apnsToken.

Swift

func application(_ application: UIApplication,
    didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
  Messaging.messaging().apnsToken = deviceToken;
}
 

Objective-C

- (void)application:(UIApplication *)application
    didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
  [FIRMessaging messaging].APNSToken = deviceToken;
}

Để chuyển thông tin biên nhận thông báo đến Analytics, hãy sử dụng phương thức appDidReceiveMessage(_:).

Swift

func userNotificationCenter(_ center: UNUserNotificationCenter,
                            willPresent notification: UNNotification,
  withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
  let userInfo = notification.request.content.userInfo

  Messaging.messaging().appDidReceiveMessage(userInfo)

  // Change this to your preferred presentation option
  completionHandler([[.alert, .sound]])
}

func userNotificationCenter(_ center: UNUserNotificationCenter,
                            didReceive response: UNNotificationResponse,
                            withCompletionHandler completionHandler: @escaping () -> Void) {
  let userInfo = response.notification.request.content.userInfo

  Messaging.messaging().appDidReceiveMessage(userInfo)

  completionHandler()
}

func application(_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable : Any],
   fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
  Messaging.messaging().appDidReceiveMessage(userInfo)
  completionHandler(.noData)
}

Objective-C

- (void)userNotificationCenter:(UNUserNotificationCenter *)center
       willPresentNotification:(UNNotification *)notification
         withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
  NSDictionary *userInfo = notification.request.content.userInfo;

  [[FIRMessaging messaging] appDidReceiveMessage:userInfo];

  // Change this to your preferred presentation option
  completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionAlert);
}

- (void)userNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)response
         withCompletionHandler:(void(^)(void))completionHandler {
  NSDictionary *userInfo = response.notification.request.content.userInfo;

  [[FIRMessaging messaging] appDidReceiveMessage:userInfo];

  completionHandler();
}

- (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler {
  [[FIRMessaging messaging] appDidReceiveMessage:userInfo];
  completionHandler(UIBackgroundFetchResultNoData);
}