إعداد تطبيق عميل "المراسلة عبر السحابة الإلكترونية من Firebase" على أنظمة Apple الأساسية

بالنسبة إلى تطبيقات عميل Apple، يمكنك تلقّي إشعارات وحِزم بيانات يصل حجمها إلى 4096 بايت عبر واجهة Firebase Cloud Messaging APNs.

لكتابة رمز العميل بلغة Objective-C أو Swift، ننصحك باستخدام FIRMessaging API. يقدّم مثال البدء السريع رمزًا نموذجيًا لكلتا اللغتَين.

تغيير وظيفة الإجراء في Firebase Cloud Messaging

تنفِّذ حزمة تطوير البرامج (SDK) الخاصة بخدمة FCM عملية تبديل الطرق في مجالَين رئيسيَّين: ربط رمز APNs المميز برمز التسجيل الخاص بخدمة FCM، وتسجيل بيانات الإحصاءات أثناء معالجة معاودة الاتصال بالرسائل الواردة. يمكن للمطوّرين الذين يفضّلون عدم استخدام swizzling إيقافها من خلال إضافة العلامة FirebaseAppDelegateProxyEnabled إلى ملف Info.plist الخاص بالتطبيق وضبطها على NO (قيمة منطقية). توفّر الأقسام ذات الصلة في الأدلة أمثلة على الرموز البرمجية، سواء كانت ميزة "تبديل الطرق" مفعّلة أم لا.

إضافة Firebase إلى مشروع Apple

أضِف Firebase إلى مشروع Apple إذا لم يسبق لك إجراء ذلك.

تحميل مفتاح مصادقة APNs

حمِّل مفتاح مصادقة APNs إلى Firebase. إذا لم يكن لديك مفتاح مصادقة APNs، احرص على إنشاء مفتاح في مركز أعضاء مطوّري Apple.

  1. داخل مشروعك في وحدة تحكّم Firebase، انقر على رمز الترس، ثم على إعدادات المشروع، ثم على علامة التبويب Cloud Messaging.

  2. في مفتاح مصادقة APNs ضمن إعداد تطبيق iOS، انقر على زر تحميل.

  3. انتقِل إلى الموقع الذي حفظت فيه المفتاح، واختَره، ثم انقر على فتح. أضِف معرّف المفتاح (المتوفّر في Apple Developer Member Center) وانقر على تحميل.

التسجيل لتلقّي إشعارات عن بُعد

إما عند بدء التشغيل أو في النقطة المطلوبة في مسار تطبيقك، سجِّل تطبيقك لتلقّي الإشعارات عن بُعد. استخدِم Call registerForRemoteNotifications كما هو موضّح أدناه:

Swift

UNUserNotificationCenter.current().delegate = self

let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
UNUserNotificationCenter.current().requestAuthorization(
  options: authOptions,
  completionHandler: { _, _ in }
)

application.registerForRemoteNotifications()

Objective-C

[UNUserNotificationCenter currentNotificationCenter].delegate = self;
UNAuthorizationOptions authOptions = UNAuthorizationOptionAlert |
    UNAuthorizationOptionSound | UNAuthorizationOptionBadge;
[[UNUserNotificationCenter currentNotificationCenter]
    requestAuthorizationWithOptions:authOptions
    completionHandler:^(BOOL granted, NSError * _Nullable error) {
      // ...
    }];

[application registerForRemoteNotifications];

الوصول إلى رمز التسجيل

تنشئ حزمة تطوير البرامج (SDK) FCM تلقائيًا رمز تسجيل لمثيل تطبيق العميل عند تشغيل التطبيق. ومثل رمز APNs المميز للجهاز، يتيح لك هذا الرمز المميز إرسال إشعارات مستهدَفة إلى أي مثيل معيّن من تطبيقك.

وبالطريقة نفسها التي توفّر بها منصات Apple عادةً رمزًا مميزًا للجهاز في خدمة APNs عند بدء تشغيل التطبيق، توفّر خدمة FCM رمز تسجيل من خلال طريقة FIRMessagingDelegatemessaging:didReceiveRegistrationToken:. تستردّ حزمة تطوير البرامج (SDK) الخاصة بميزة "المراسلة عبر السحابة الإلكترونية من Firebase" رمزًا مميزًا جديدًا أو حاليًا أثناء تشغيل التطبيق الأوّلي وكلما تم تعديل الرمز المميز أو إبطاله. في جميع الحالات، يستدعي حزمة تطوير البرامج (SDK) لخدمة FCM الدالة messaging:didReceiveRegistrationToken: مع رمز مميّز صالح.

قد يتغيّر رمز التسجيل في الحالات التالية:

  • تمت استعادة التطبيق على جهاز جديد
  • يلغي المستخدم تثبيت التطبيق أو يعيد تثبيته
  • يمحو المستخدم بيانات التطبيق.

ضبط حساب المفوّض للمراسلة

لتلقّي رموز التسجيل، عليك تنفيذ بروتوكول تفويض المراسلة وضبط السمة delegate الخاصة بـ FIRMessaging بعد استدعاء [FIRApp configure]. على سبيل المثال، إذا كان وكيل تطبيقك يتوافق مع بروتوكول وكيل المراسلة، يمكنك ضبط الوكيل على application:didFinishLaunchingWithOptions: ليكون هو نفسه.

Swift

Messaging.messaging().delegate = self

Objective-C

[FIRMessaging messaging].delegate = self;

جلب رمز التسجيل الحالي

يتم تسليم رموز التسجيل المميَّزة من خلال الطريقة messaging:didReceiveRegistrationToken:. يتم استدعاء هذه الطريقة بشكل عام مرة واحدة لكل عملية بدء تشغيل التطبيق باستخدام رمز التسجيل المميز. عند استدعاء هذه الطريقة، يكون الوقت مثاليًا لإجراء ما يلي:

  • إذا كان رمز التسجيل جديدًا، أرسِله إلى خادم تطبيقك.
  • الاشتراك في المواضيع باستخدام رمز التسجيل المميز هذه السمة مطلوبة فقط للاشتراكات الجديدة أو في الحالات التي أعاد فيها المستخدم تثبيت التطبيق.

يمكنك استرداد الرمز المميّز مباشرةً باستخدام token(completion:). يتم تقديم خطأ غير فارغ إذا تعذّر استرداد الرمز المميّز بأي شكل من الأشكال.

Swift

Messaging.messaging().token { token, error in
  if let error = error {
    print("Error fetching FCM registration token: \(error)")
  } else if let token = token {
    print("FCM registration token: \(token)")
    self.fcmRegTokenMessage.text  = "Remote FCM registration token: \(token)"
  }
}

Objective-C

[[FIRMessaging messaging] tokenWithCompletion:^(NSString *token, NSError *error) {
  if (error != nil) {
    NSLog(@"Error getting FCM registration token: %@", error);
  } else {
    NSLog(@"FCM registration token: %@", token);
    self.fcmRegTokenMessage.text = token;
  }
}];

يمكنك استخدام هذه الطريقة في أي وقت للوصول إلى الرمز المميّز بدلاً من تخزينه.

مراقبة إعادة تحميل الرمز المميز

لتلقّي إشعار كلما تم تعديل الرمز المميّز، عليك تقديم عنصر نائب يتوافق مع بروتوكول عنصر نائب المراسلة. يسجّل المثال التالي المفوّض ويضيف طريقة المفوّض المناسبة:

Swift

func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
  print("Firebase registration token: \(String(describing: fcmToken))")

  let dataDict: [String: String] = ["token": fcmToken ?? ""]
  NotificationCenter.default.post(
    name: Notification.Name("FCMToken"),
    object: nil,
    userInfo: dataDict
  )
  // TODO: If necessary send token to application server.
  // Note: This callback is fired at each app startup and whenever a new token is generated.
}

Objective-C

- (void)messaging:(FIRMessaging *)messaging didReceiveRegistrationToken:(NSString *)fcmToken {
    NSLog(@"FCM registration token: %@", fcmToken);
    // Notify about received token.
    NSDictionary *dataDict = [NSDictionary dictionaryWithObject:fcmToken forKey:@"token"];
    [[NSNotificationCenter defaultCenter] postNotificationName:
     @"FCMToken" object:nil userInfo:dataDict];
    // TODO: If necessary send token to application server.
    // Note: This callback is fired at each app startup and whenever a new token is generated.
}

بدلاً من ذلك، يمكنك الاستماع إلى حدث NSNotification باسم kFIRMessagingRegistrationTokenRefreshNotification بدلاً من توفير طريقة تفويض. تحتوي سمة الرمز المميّز دائمًا على قيمة الرمز المميّز الحالية.

تم إيقاف عملية استبدال الرمز: ربط الرمز المميز لخدمة APNs بالرمز المميز للتسجيل

إذا كنت قد أوقفت ميزة "تبديل الطرق" أو كنت بصدد إنشاء تطبيق SwiftUI، عليك ربط رمز APNs المميز بشكل صريح برمز التسجيل FCM. نفِّذ طريقة application(_:didRegisterForRemoteNotificationsWithDeviceToken:) لاسترداد رمز APNs المميّز، ثم اضبط السمة apnsToken الخاصة بـ Messaging على النحو التالي:

Swift

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

Objective-C

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

بعد إنشاء رمز التسجيل FCM، يمكنك الوصول إليه والاستماع إلى أحداث إعادة التحميل باستخدام الطرق نفسها كما هو الحال عند تفعيل swizzling.

منع بدء التشغيل التلقائي

عند إنشاء رمز تسجيل FCM، تحمّل المكتبة المعرّف وبيانات الإعداد إلى Firebase. إذا كنت تريد الحصول على موافقة صريحة من المستخدمين أولاً، يمكنك منع إنشاء الرموز المميزة في وقت الإعداد عن طريق إيقاف ميزة "المراسلة عبر السحابة الإلكترونية من Firebase". لإجراء ذلك، أضِف قيمة بيانات وصفية إلى Info.plist (وليس إلى GoogleService-Info.plist):

FirebaseMessagingAutoInitEnabled = NO

لإعادة تفعيل FCM، يمكنك إجراء عملية استدعاء وقت التشغيل:

Swift

Messaging.messaging().autoInitEnabled = true

Objective-C

[FIRMessaging messaging].autoInitEnabled = YES;

تظل هذه القيمة محفوظة عند إعادة تشغيل التطبيق بعد ضبطها.

الخطوات التالية

بعد إعداد تطبيق Apple، يمكنك إضافة معالجة الرسائل وغيرها من السلوكيات الأكثر تقدّمًا إلى تطبيقك. راجِع الأدلة التالية للحصول على مزيد من المعلومات: