طرح ميزة "التحقّق من التطبيقات في Firebase" تدريجيًا باستخدام ميزة "الإعداد عن بُعد في Firebase"

1- مقدمة

يمكنك استخدام ميزة فحص التطبيق من Firebase مع ميزة App Attest لحماية خدماتك الخلفية والتحقّق من أنّ مصدر الطلبات إلى خدمات Firebase هو تطبيقك الأصلي.

ننصح عمومًا بمنح المستخدمين إمكانية الوصول تدريجيًا إلى خدمة App Attest لتجنّب بلوغ حدود الحصة المسموح بها. لمزيد من المعلومات، يُرجى الاطّلاع على مقالة "الاستعداد لاستخدام خدمة App Attest" من Apple. التوثيق.

إمكانية إصدار تحديثات التطبيقات بشكل تدريجي باستخدام ميزة App Store Connect من Apple، على النحو الموضّح في مقالة "إصدار تحديث للإصدار على مراحل"، إلى تسهيل عملية طرح ميزة "فحص التطبيق". يعد ذلك حلاً مباشرًا وبسيطًا. ومع ذلك، فإنّ إطلاق تحديث لإصدار التطبيق على مراحل لا يتيح لك التحكّم في عملية طرح التطبيقات الحالية والمحدَّثة أو تغيير سلوكها بدون نشر إصدار جديد منه.

إحدى الطرق لزيادة التحكّم في عملية طرح "فحص التطبيق" من خلال App Attest هي استخدام ميزة "الإعداد عن بُعد في Firebase" لتفعيل ميزة "فحص التطبيق" من خلال App Attest لنسبة مئوية من مستخدمي التطبيق في كل مرة. قد يساعد ذلك في تجنُّب تقييد الوصول من خوادم المصادقة. يمكن استخدام "إحصاءات Google" لرصد تأثير الطرح على المستخدمين.

المعلومات التي ستطّلع عليها

في هذا الدرس التطبيقي المتعدّد الخطوات، ستتعرّف على كيفية استخدام ميزة "الإعداد عن بُعد في Firebase" لطرح ميزة "التحقّق من التطبيقات" في تطبيقك.

يستخدم هذا الدرس التطبيقي مشروع Firebase استنادًا إلى تطبيق البدء السريع DatabaseExample ومتكامل مع ميزة "التحقّق من التطبيقات من Firebase"، كما هو موضّح في الدرس التطبيقي حول ترميز Firebase App Check for Apple Platforms. يتيح تطبيق DatabaseExample Quickstart للمستخدمين تسجيل الدخول وإضافة المشاركات باستخدام ميزات قاعدة بيانات Firebase في الوقت الفعلي.

يمكنك أيضًا تعديل الخطوات الواردة في هذا الدرس التطبيقي حول الترميز لاختبار تطبيقك.

المتطلبات الأساسية

المتطلبات

2- إنشاء موفِّر مصادقة مخصّص

في هذه الخطوة، سيتم إنشاء فئة مخصّصة لمقدّم الخدمة من أجل تقديم رمز مميّز فقط عندما تكون ميزة App Attest مفعّلة. تعتمد ميزة "الإعداد عن بُعد" على مثيل تطبيق Firebase تم ضبطه، ويعمل مقدِّم الخدمة المخصّص الذي تنفّذه في هذه الخطوة كعنصر نائب لإنهاء عملية الضبط.

لإكمال الخطوات التالية، يجب إضافة Firebase وFirebaseRemoteConfig وFirebaseAnalytics في قسم إطارات العمل والمكتبات والمحتوى المضمَّن لتطبيقك في Xcode. للاطّلاع على مثال حول كيفية إجراء ذلك، يمكنك الرجوع إلى الدرس التطبيقي حول ترميز تطبيقات Firebase من حيث ترميز منصات Apple.

  1. أنشِئ ملفًا باسم MyAppCheckProvider. وهي فئة فرعية من NSObject تتوافق مع بروتوكول AppCheckProvider.
  2. يمكنك إدراج طريقة getToken() فارغة سيتم ملؤها لاحقًا.

اطّلِع على المثال التالي لرمز فئة مقدِّم الخدمة المخصّص الذي يتضمّن طريقة getToken() فارغة.

// MyAppCheckProvider.swift

import Firebase
import FirebaseAnalytics
import FirebaseAppCheck
import FirebaseRemoteConfig

class MyAppCheckProvider: NSObject, AppCheckProvider {
  func getToken(completion handler: @escaping (AppCheckToken?, Error?) -> Void) {}
}

لإنشاء مثيل لـ AppAttestProvider، يجب تمرير نسخة افتراضية من FirebaseApp المقابلة. أنشِئ خاصية مخزَّنة له واقبلها كمَعلمة أداة الإعداد:

// MyAppCheckProvider.swift

import Firebase
import FirebaseAnalytics
import FirebaseAppCheck
import FirebaseRemoteConfig

class MyAppCheckProvider: NSObject, AppCheckProvider {
  // Firebase app instance served by the provider.
  let firebaseApp: FirebaseApp

  // The App Check provider factory should pass the FirebaseApp instance.
  init(app: FirebaseApp) {
    self.firebaseApp = app
    super.init()
  }

  func getToken(completion handler: @escaping (AppCheckToken?, Error?) -> Void) {}
}

إعادة توجيه طلب الرمز المميّز إلى موفِّر خدمة App Attest

أصبح لديك الآن كل الإجراءات لإعادة توجيه طلب الرمز المميّز إلى موفِّر خدمة App Attest على طريقة getToken().

ملاحظة: يمكنك الاطّلاع على مزيد من المعلومات حول طريقة getToken() في مرجع إطار عمل FirebaseAppCheck.

أضِف الرمز التالي إلى طريقة getToken():

// MyAppCheckProvider.swift

import Firebase
import FirebaseAnalytics
import FirebaseAppCheck
import FirebaseRemoteConfig

class MyAppCheckProvider: NSObject, AppCheckProvider {
  // Firebase app instance served by the provider.
  let firebaseApp: FirebaseApp

  // The App Check provider factory should pass the FirebaseApp instance.
  init(app: FirebaseApp) {
    self.firebaseApp = app
    super.init()
  }

  private lazy var appAttestProvider = AppAttestProvider(app: firebaseApp)

  func getToken(completion handler: @escaping (AppCheckToken?, Error?) -> Void) {
    // Fetch App Attest flag from Remote Config
    let remoteConfig = RemoteConfig.remoteConfig(app: firebaseApp)
    remoteConfig.fetchAndActivate { remoteConfigStatus, error in
      // Get App Attest flag value
      let appAttestEnabled = remoteConfig.configValue(forKey: "AppAttestEnabled").boolValue

      guard appAttestEnabled else {
        // Skip attestation if App Attest is disabled. Another attestation
        // method like DeviceCheck may be used instead of just skipping.
        handler(nil, MyProviderError.appAttestIsDisabled)
        return
      }

      // Try to obtain an App Attest provider instance and fail if cannot
      guard let appAttestProvider = self.appAttestProvider else {
        handler(nil, MyProviderError.appAttestIsUnavailable)
        return
      }

      // If App Attest is enabled for the app instance, then forward the
      // Firebase App Check token request to the App Attest provider
      appAttestProvider.getToken(completion: handler)
    }
  }
}

enum MyProviderError: Error {
  case appAttestIsDisabled
  case appAttestIsUnavailable
  case unexpected(code: Int)
}

يتحقّق الرمز السابق من المَعلمة المنطقية لميزة "الإعداد عن بُعد" AppAttestEnabled (سيتم إنشاء مَعلمة "الإعداد عن بُعد" هذه لاحقًا في الدرس التطبيقي حول الترميز). إذا كانت القيمة خاطئة، سيتعذر الرمز، ما يشير إلى عدم طرح ميزة "التحقّق من التطبيقات" على الجهاز الحالي. إذا كانت القيمة صحيحة، سيحاول الرمز الحصول على مزوّد App Attest إذا لم يكن ممكنًا. في حال اجتياز عمليات التحقّق من الأخطاء هذه، سيعيد الرمز توجيه طلب الرمز المميّز إلى موفِّر خدمة App Attest.

إضافة أحداث "إحصاءات Google"

من خلال إضافة أحداث "إحصاءات Google"، يمكنك الحصول على إحصاءات أفضل عن مدى نجاح عملية طرح ميزة "فحص التطبيق". ستساعد "إحصاءات Google" في تحديد ما إذا كان يجب تفعيل App Attest لجمهور أكبر.

سجِّل حدثَين في "إحصاءات Google": AppAttestSuccess عند تحقيق النجاح، وAppAttestFailure عند التعذُّر. يمكن أن يساعد هذان الحدثان في "إحصاءات Google" في تتبُّع مدى نجاح عملية طرح ميزة "التحقّق من التطبيقات" ومساعدتك في تحديد ما إذا كان من المفترض إجراء عملية طرح أكبر.

func getToken(completion handler: @escaping (AppCheckToken?, Error?) -> Void) {
  // Fetch Remote Config.
  let remoteConfig = RemoteConfig.remoteConfig(app: firebaseApp)
  remoteConfig.fetchAndActivate { remoteConfigStatus, error in
    // Get App Attest flag value from Remote Config.
    let appAttestEnabled = remoteConfig.configValue(forKey: "AppAttestEnabled").boolValue

    guard appAttestEnabled else {
      // Skip attestation if App Attest is disabled. Another attestation
      // method like DeviceCheck may be used instead of just skipping.
      handler(nil, MyProviderError.appAttestIsDisabled)
      return
    }

    // Try to obtain an App Attest provider instance and fail otherwise.
    guard let appAttestProvider = self.appAttestProvider else {
      handler(nil, MyProviderError.appAttestIsUnavailable)
      return
    }

    // If App Attest is enabled for the app instance, then forward the
    // Firebase App Check token request to the App Attest provider.
    appAttestProvider.getToken { token, error in
      // Log an Analytics event to track attestation success rate.
      let appAttestEvent: String
      if (token != nil && error == nil) {
        appAttestEvent = "AppAttestSuccess"
      } else {
        appAttestEvent = "AppAttestFailure"
      }
      Analytics.logEvent(appAttestEvent, parameters: nil)

      // Pass the result to the handler
      handler(token, error)
    }
  }
}

3- تعديل فئة Provider Machine

بعد تنفيذ المنطق المطلوب لإعادة توجيه طلب الرمز المميّز إلى مقدّم خدمة App Attest وإضافة بعض أحداث "إحصاءات Google"، عليك تعديل حدث "MyAppCheckProviderFactory.class" الذي أنشأته في الدرس التطبيقي حول ترميز App Check for Apple Platforms. ستستهدِف هذه الفئة موفِّر تصحيح أخطاء التطبيق للمحاكيات، وستستهدِف أيضًا مقدِّم الخدمة المخصَّص.

عدِّل الرمز التالي في فئة MyAppCheckProviderFactory التي أنشأتها في الدرس التطبيقي حول ترميز أنظمة Firebase App Check for Apple:

// MyAppCheckProviderFactory.swift

import Firebase

class MyAppCheckProviderFactory: NSObject, AppCheckProviderFactory {
  func createProvider(with app: FirebaseApp) -> AppCheckProvider? {
      #if targetEnvironment(simulator)
      // App Attest is not available on simulators.
      // Use a debug provider.
      let provider = AppCheckDebugProvider(app: app)

      // Print only locally generated token to avoid a valid token leak on CI.
      print("Firebase App Check debug token: \(provider?.localDebugToken() ?? "" )")

      return provider
      #else
      if #available(iOS 14.0, *) {
        // Use your custom App Attest provider on real devices.
        return MyAppCheckProvider(app: app)
      } else {
        return DeviceCheckProvider(app: app)
      }
      #endif
  }
}

تأكَّد من ضبط AppCheckProviderFactory قبل ضبط FirebaseApp:

// DatabaseExampleApp.swift

import SwiftUI
import Firebase
import FirebaseAppCheck

@main
struct DatabaseExampleApp: App {
  init() {
    AppCheck.setAppCheckProviderFactory(MyAppCheckProviderFactory())
    FirebaseApp.configure()
  }

  // ...
}

4. إضافة مَعلمة "الإعداد عن بُعد" في وحدة تحكُّم Firebase

ستضيف الآن مَعلمة "الإعداد عن بُعد" AppAttestEnabled إلى وحدة تحكُّم Firebase . تتطلب طريقة getToken هذه المعلمة.

لإنشاء مَعلمة "الإعداد عن بُعد" في وحدة تحكُّم Firebase :

  1. افتح الإعداد عن بُعد لمشروعك وانقر على إضافة مَعلمة. إذا كانت هذه هي المرة الأولى التي تستخدم فيها ميزة "الإعداد عن بُعد"، انقر على إنشاء إعداد.
  2. في حقل اسم المَعلمة (المفتاح)، أدخِل AppAttestEnabled.
  3. من القائمة المنسدلة نوع البيانات، اختَر منطقي.
  4. من القائمة المنسدلة القيمة التلقائية، اختَر خطأ.

إنشاء مَعلمة "الإعداد عن بُعد" في وحدة تحكُّم Firebase

قبل النقر على "حفظ"، أنشئ قيمة شرطية لنسبة% 10 من المستخدمين:

  1. انقر على إضافة جديد >. القيمة الشرطية > إنشاء شرط جديد.
  2. في حقل الاسم، أدخِل اسم شرط.
  3. ضمن تنطبق إذا...، اختَر المستخدم في شريحة مئوية عشوائية، <=، ثم أدخِل 10 في الحقل %.
  4. انقر على إنشاء شرط.

تحديد شرط &quot;الإعداد عن بُعد&quot; في وحدة تحكُّم Firebase

اضبط القيمة الشرطية على true حتى يتم طرح App Attest لنسبة% 10 من المستخدمين.

  1. اضبط القيمة على true للشرط الذي أنشأته للتو.
  2. انقر على حفظ.

مراجعة مَعلمة &quot;الإعداد عن بُعد&quot; في وحدة تحكُّم Firebase

عند الانتهاء، انشر التغييرات في ميزة "الإعداد عن بُعد".

اختبار الطرح على جهازك

لاختبار قيم علامات "الإعداد عن بُعد" المختلفة على جهازك بدون تعديل رمز التطبيق، عليك إعداد تجربة على المَعلمة AppAttestEnabled باتّباع البرنامج التعليمي "إنشاء تجارب الإعداد عن بُعد في Firebase" باستخدام "اختبار A/B". قسم الدليل التوجيهي "التحقّق من صحة تجربتك على جهاز اختبار" يشرح كيفية تحديد قيم مختلفة لجهاز الاختبار.

الخطوة الأخيرة هي استخدام "إحصاءات Google" لمراقبة مدى نجاح عملية طرح ميزة App Attest.

5- مراجعة مدى نجاح طرح AppCheck

يمكنك قياس نجاح عملية الطرح من خلال لوحة بيانات الأحداث في "إحصاءات Google". ترقُّب حدثَي AppAttestSuccess وAppAttestFailure. قد يستغرِق ظهور الأحداث في لوحة البيانات ما يصل إلى 24 ساعة. بدلاً من ذلك، يمكنك تفعيل تصحيح الأخطاء واستخدام DebugView للاطّلاع على أحداث تصحيح الأخطاء بسرعة أكبر.

يمكنك اختياريًا مراقبة لوحة بيانات Crashlytics لمعرفة الزيادات في نسبة الأعطال. لمزيد من المعلومات عن إضافة Crashlytics إلى تطبيقك، راجع بدء استخدام Firebase Crashlytics.

بعد ظهور أحداث AppAttestSuccess في أغلب الأحيان وعدد قليل من أحداث AppAttestFailure، يُعتبر ذلك علامة جيدة على أنه يمكنك زيادة النسبة المئوية للمستخدمين الذين تم تفعيل App Attest من خلال تعديل الحالة في مَعلمة "الإعداد عن بُعد" AppAttestEnabled.

مراجعة أحداث &quot;إحصاءات Google&quot; في وحدة تحكُّم Firebase

اختياري: الاستفادة من جمهور "إحصاءات Google"

إذا كنت تريد الاستفادة بشكل أكبر من حدث AppAttestEnabled في "إحصاءات Google"، يمكنك إنشاء شريحة جمهور في "إحصاءات Google" لتتبُّع المستخدمين مع ضبط قيمة AppAttestEnabled على "صحيح".

تم إصدار App Attest مع الإصدار 14.0 من نظام التشغيل iOS. قد لا يكون بعض المستخدمين مشتركين في هذا الإصدار، وبالتالي لن يكونوا مؤهّلين للاستفادة من ميزة App Attest. يمكنك تسجيل حدث آخر في "إحصاءات Google" لتتبُّع هؤلاء المستخدمين، ثم استهداف ذلك الجمهور بطريقة مصادقة أخرى، مثل عملية DeviceCheck.

اختياري: استخدام Crashlytics لمراقبة الأعطال

للتعرّف بشكل أفضل على ثبات تطبيقك أثناء الطرح، يمكنك استخدام أداة Firebase Crashlytics لرصد الأعطال وغير الفادحة.

6- تهانينا

لقد طرحت ميزة "التحقّق من التطبيقات" بنجاح باستخدام ميزة "الإعداد عن بُعد". 🎉

مراجع إضافية: