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

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

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

FCM gửi tất cả tin nhắn nhắm mục tiêu đến ứng dụng Apple thông qua APN. Để tìm hiểu thêm về cách nhận thông báo APN 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 biểu UNUserNotificationCenter và triển khai các phương thức đại biểu thích hợp để nhận thông báo hiển thị từ FCM.

Nhanh


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

Mục tiêu-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 tùy chỉnh vào thông báo của mình, hãy đặt tham số click_action trong tải trọng thông báo . Sử dụng giá trị mà bạn sẽ sử dụng cho khóa category trong tải trọng APN. Các hành động tùy chỉnh phải được đăng ký trước khi chúng có thể được 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 gửi tin nhắn tới ứng dụng của bạn, hãy xem trang tổng quan báo cáo FCM , nơi ghi lại số lượng tin nhắn đã gửi và mở trên thiết bị Apple và Android, cùng với dữ liệu về "số lần hiển thị" (thông báo mà người dùng đã xem) cho ứng dụng Android.

Xử lý thông báo đẩy im lặng

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

Triển khai application(_:didReceiveRemoteNotification:fetchCompletionHandler:) như được hiển thị:

Nhanh

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
}

Mục tiêu-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);
}

Nền tảng của Apple không đảm bảo việc gửi thông báo nền. Để tìm hiểu về các điều kiện có thể khiến thông báo nền không thành công, hãy xem tài liệu của Apple về Đẩy các bản cập nhật nền cho ứng dụng của bạn .

Giải thích tải trọng tin nhắn thông báo

Tải trọng của tin nhắn thông báo là một từ điển các khóa và giá trị. Tin nhắn 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ý tin nhắn với phương thức swizzing bị vô hiệu hóa

Theo mặc định, nếu bạn chỉ định lớp đại biểu ứng dụng của ứng dụng cho thuộc tính đại biểu UNUserNotificationCenterMessaging , FCM sẽ sắp xếp lớp đại biểu ứng dụng của bạn để tự động liên kết mã thông báo FCM của bạn với mã thông báo APN của thiết bị và chuyển các sự kiện nhận được thông báo tới Analytics. Nếu bạn tắt rõ ràng tính năng chuyển đổi phương thức, nếu bạn đang xây dựng một ứng dụng SwiftUI hoặc nếu bạn sử dụng một lớp riêng cho một trong hai đại biểu, thì bạn sẽ cần phải thực hiện cả hai tác vụ 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 chuyể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 đại biểu ứng dụng của bạn thông qua thuộc tính apnsToken .

Nhanh

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

Mục tiêu-C

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

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

Nhanh

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

Mục tiêu-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);
}