استلام الرسائل في تطبيق Apple

بعد تثبيت تطبيق العميل على أحد الأجهزة، يمكنه تلقّي الرسائل من خلال واجهة أسماء نقاط الوصول (APN) لـ FCM. يمكنك بدء إرسال إشعارات إلى شرائح المستخدمين مُنشئ الإشعارات، أو الرسائل المنشأة على خادم التطبيق.

التعامل مع إشعارات التنبيهات

يعرض "FCM" جميع الرسائل التي تستهدف تطبيقات Apple من خلال أسماء نقاط الوصول (APN). معرفة المزيد حول تلقّي إشعارات أسماء نقاط الوصول (APN) عبر UNUserNotificationCenter، راجع وثائق حول التعامل مع الإشعارات والإجراءات المتعلقة بالإشعارات:

يجب عليك تعيين تفويض UNUserNotificationCenter وتنفيذ أساليب التفويض المناسبة لتلقي إشعارات العرض ابتداءً من 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();
}

إذا كنت تريد إضافة إجراءات مخصصة إلى الإشعارات، اضبط معلَمة click_action في السمة حمولة الإشعارات استخدم القيمة التي ستستخدمها المفتاح category في حمولة أسماء نقاط الوصول (APN). يجب تسجيل الإجراءات المخصّصة قبل استخدامها. لمزيد من المعلومات، راجع دليل برمجة الإشعارات المحلية وتلك عن بُعد:

للحصول على إحصاءات بشأن تسليم الرسائل إلى تطبيقك، راجِع FCM لوحة بيانات إعداد التقارير، التي تسجّل عدد الرسائل المرسَلة وفتحها على أجهزة Apple وAndroid، إلى جانب بيانات "مرات الظهور" (الإشعارات التي اطّلع عليها المستخدمون) لتطبيقات Android.

التعامل مع الإشعارات الفورية الصامتة

عند إرسال رسائل باستخدام مفتاح content-available (بما في ذلك مفتاح أسماء نقاط الوصول (APN) content-available، سيتم تسليم الرسائل كإشعارات صامتة. تشغيل تطبيقك في الخلفية لمهام مثل إعادة تحميل بيانات الخلفية. على عكس الإشعارات التي تعمل في المقدّمة، يجب التعامل معها من خلال application(_:didReceiveRemoteNotification:fetchCompletionHandler:) .

تنفيذ application(_:didReceiveRemoteNotification:fetchCompletionHandler:) كما هو موضح:

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

لا تضمن أنظمة 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) للجهاز، عليك ضبط أسماء نقاط الوصول (APN). رمز مميّز لفئة "Messaging" ضِمن حساب مفوَّض تطبيقك معالِج إعادة تحميل الرمز المميّز من خلال الموقع الإلكتروني 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;
}

لإرسال معلومات إيصال الإشعارات إلى Analytics، استخدِم طريقة 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);
}