Catch up on everything we announced at this year's Firebase Summit. Learn more

קבלת הודעות באפליקציית אפל

ברגע שהאפליקציה של הלקוח שלך מותקנת במכשיר, היא יכולה לקבל הודעות דרך ממשק ה-APNs של FCM. אתה יכול מייד להתחיל לשלוח הודעות לפלחי משתמש עם מלחין ההודעות , או הודעות בנוי על שרת היישומים שלך.

טיפול בהודעות התראה

FCM מספקת את כל ההודעות המכוונות לאפליקציות אפל דרך APN. כדי ללמוד עוד על קבלת התראות APNs באמצעות UNUserNotificationCenter, עיין בתיעוד של אפל על הודעות טיפול ופעולות להתראה קשורים .

אתה חייב להגדיר את נציג UNUserNotificationCenter וליישם שיטות הנציג המתאימות לקבל הודעות תצוגה מ FCM.

מָהִיר

@available(iOS 10, *)
extension AppDelegate: UNUserNotificationCenterDelegate {
  // Receive displayed notifications for iOS 10 devices.
  func userNotificationCenter(_ center: UNUserNotificationCenter,
                              willPresent notification: UNNotification,
                              withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions)
                                -> Void) {
    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
    completionHandler([[.alert, .sound]])
  }

  func userNotificationCenter(_ center: UNUserNotificationCenter,
                              didReceive response: UNNotificationResponse,
                              withCompletionHandler completionHandler: @escaping () -> Void) {
    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)

    completionHandler()
  }
}

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

אם אתה רוצה להוסיף פעולות מותאמות אישית להודעות שלך, להגדיר את click_action פרמטר מטען ההודעה . השתמש ערך כי תשתמש עבור category מפתח מטען APNs. יש לרשום פעולות מותאמות אישית לפני שניתן יהיה להשתמש בהן. לקבלת מידע נוסף, ראה של אפל Notification מקומי ומרוחק תכנות מדריך .

לקבלת תובנה משלוח הודעה באפליקציה, לראות את FCM מרכז השליטה של דיווח , אשר מתעדת את מספר ההודעות שנשלחו ופתח גם במכשירי Apple ו- Android, יחד עם נתונים עבור "הופעות" (הודעות נתפס על ידי משתמשים) עבור אפליקציות אנדרואיד.

טפל בהתראות דחיפה שקטות

בעת שליחת הודעות עם content_available המפתח (שווות ערך ל APNs של content-available , המסרים יימסרו כהתראה שותקת, להעיר את האפליקציה ברקע למשימות כמו רענון נתונים ברקע. הודעות בחזית בניגוד, הודעות אלה חייבות להיות מטופלים באמצעות appDelegate(_:didReceiveRemoteNotification:fetchCompletionHandler:) השיטה.

ליישם application(_:didReceiveRemoteNotification:fetchCompletionHandler:) כמוצג:

מָהִיר

func application(_ application: UIApplication,
                 didReceiveRemoteNotification userInfo: [AnyHashable: Any],
                 fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult)
                   -> Void) {
  // 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)

  completionHandler(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);
}

פלטפורמות אפל אינן מבטיחות מסירת הודעות רקע. כדי ללמוד על התנאים שיכולים לגרום הודעות ברקע להיכשל, לראות מסמכים של אפל על דחיפת עדכונים רקע היישום שלך .

פירוש מטען הודעת הודעה

המטען של הודעות ההתראה הוא מילון של מפתחות וערכים. הודעות הודעה שנשלחות דרך APN עוקבות אחר פורמט המטען של APNs כמפורט להלן:

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

טפל בהודעות עם שיטת swizzling מושבתת

כברירת מחדל, אם אתה מקצה הכיתה delegate של היישום של האפליקציה שלך UNUserNotificationCenter ו Messaging המאפיינים הנציג, FCM יהיה בקשית בכיתה delegate של היישום שלך באופן אוטומטי אסוציאציה אסימון FCM שלך עם של ה- APN במכשיר אסימון ולהעביר אירועים-קיבל הודעה Analytics. אם אתה משבית במפורש את שיטת swizzling או משתמש במחלקה נפרדת עבור כל אחד מהנציגים, תצטרך לבצע את שתי המשימות הללו באופן ידני.

כדי לשייך את FCM אסימון עם APNs מכשיר אסימון, להעביר את ה- APN אסימון אל Messaging בכיתה ב של delegate של היישום המטפל לרענן את האסימון דרך apnsToken הרכוש .

מָהִיר

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

Objective-C

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

כדי להעביר מידע reciept הודעה 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)
}

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