รับข้อความในแอป Apple

เมื่อติดตั้งแอปไคลเอนต์ของคุณบนอุปกรณ์แล้ว แอปจะสามารถรับข้อความผ่านอินเทอร์เฟซ FCM APN คุณสามารถเริ่มส่งการแจ้งเตือนไปยังกลุ่มผู้ใช้ได้ทันทีด้วย ตัวเขียนการแจ้งเตือน หรือข้อความที่สร้างขึ้นบนเซิร์ฟเวอร์แอปพลิเคชันของคุณ

จัดการการแจ้งเตือน

FCM ส่งข้อความทั้งหมดที่กำหนดเป้าหมายไปยังแอป Apple ผ่าน APN หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการรับการแจ้งเตือน APN ผ่าน UNUserNotificationCenter โปรดดูเอกสารประกอบของ Apple เกี่ยวกับ การจัดการการแจ้งเตือนและการดำเนินการที่เกี่ยวข้องกับการแจ้งเตือน

คุณต้องตั้ง ค่าผู้รับมอบสิทธิ์ UNUserNotificationCenter และใช้วิธีการมอบหมายที่เหมาะสมเพื่อรับการแจ้งเตือนที่แสดงจาก FCM

สวิฟต์


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

วัตถุประสงค์-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();
}

หากคุณต้องการเพิ่มการดำเนินการที่กำหนดเองในการแจ้งเตือน ให้ตั้งค่าพารามิเตอร์ click_action ใน เพย์โหลดการแจ้งเตือน ใช้ค่าที่คุณจะใช้สำหรับคีย์ category ในเพย์โหลด APN ต้องลงทะเบียนการดำเนินการแบบกำหนดเองก่อนจึงจะสามารถใช้งาน สำหรับข้อมูลเพิ่มเติม โปรดดูที่ คู่มือการตั้งโปรแกรมการแจ้งเตือนในพื้นที่และระยะไกล ของ Apple

สำหรับข้อมูลเชิงลึกเกี่ยวกับการส่งข้อความไปยังแอปของคุณ โปรดดูแด ชบอร์ดการรายงาน FCM ซึ่งบันทึกจำนวนข้อความที่ส่งและเปิดบนอุปกรณ์ Apple และ Android พร้อมด้วยข้อมูลสำหรับ "การแสดงผล" (การแจ้งเตือนที่ผู้ใช้เห็น) สำหรับแอป Android

จัดการการแจ้งเตือนแบบเงียบ

เมื่อส่งข้อความด้วยคีย์ content_available (เทียบเท่ากับ content-available ของ APN ข้อความจะถูกส่งเป็นการแจ้งเตือนแบบเงียบ ปลุกแอปของคุณในพื้นหลังสำหรับงานต่างๆ เช่น การรีเฟรชข้อมูลเบื้องหลัง ซึ่งแตกต่างจากการแจ้งเตือนเบื้องหน้า การแจ้งเตือนเหล่านี้ต้องได้รับการจัดการผ่าน application(_:didReceiveRemoteNotification:fetchCompletionHandler:) วิธีการ

ใช้ application(_:didReceiveRemoteNotification:fetchCompletionHandler:) ดังที่แสดง:

สวิฟต์

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
}

วัตถุประสงค์-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);
}

แพลตฟอร์มของ Apple ไม่รับประกันการส่งการแจ้งเตือนเบื้องหลัง หากต้องการเรียนรู้เกี่ยวกับเงื่อนไขที่อาจทำให้การแจ้งเตือนในพื้นหลังล้มเหลว โปรดดูเอกสารของ Apple เกี่ยวกับ การพุชการอัปเดตเบื้องหลังไปยังแอปของคุณ

การตีความเพย์โหลดข้อความแจ้งเตือน

เพย์โหลดของข้อความแจ้งเตือนคือพจนานุกรมของคีย์และค่าต่างๆ ข้อความแจ้งเตือนที่ส่งผ่าน APN เป็นไปตามรูปแบบเพย์โหลดของ APN ดังนี้:

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

จัดการข้อความโดยปิดใช้งานวิธีการหมุน

ตามค่าเริ่มต้น หากคุณกำหนดคลาสผู้รับมอบสิทธิ์แอปของแอปให้กับคุณสมบัติผู้รับมอบสิทธิ์ UNUserNotificationCenter และ Messaging FCM จะหมุนคลาสผู้รับมอบสิทธิ์แอปของคุณเพื่อเชื่อมโยงโทเค็น FCM ของคุณกับโทเค็น APN ของอุปกรณ์โดยอัตโนมัติ และส่งเหตุการณ์ที่ได้รับการแจ้งเตือนไปยัง Analytics หากคุณปิดการใช้งานเมธอด swizzling อย่างชัดเจน หากคุณกำลังสร้างแอป SwiftUI หรือหากคุณใช้คลาสแยกต่างหากสำหรับผู้รับมอบสิทธิ์ คุณจะต้องดำเนินการทั้งสองอย่างด้วยตนเอง

ในการเชื่อมโยงโทเค็น FCM กับโทเค็น APN ของอุปกรณ์ ให้ส่งโทเค็น APNs ไปยังคลาส Messaging ใน ตัวจัดการการรีเฟรชโทเค็นของผู้รับ มอบสิทธิ์แอปของคุณผ่าน คุณสมบัติ apnsToken

สวิฟต์

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

วัตถุประสงค์-C

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

หากต้องการส่งข้อมูลการรับการแจ้งเตือนไปยัง Analytics ให้ใช้ เมธอด appDidReceiveMessage(_:)

สวิฟต์

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

วัตถุประสงค์-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);
}