1. مقدمة
يمكنك استخدام ميزة "فحص التطبيقات" من Firebase مع App Attest لحماية خدمات الخلفية والتأكّد من أنّ الطلبات المُرسَلة إلى خدمات Firebase تأتي من تطبيقك الأصلي.
ننصح بشكل عام بإعداد المستخدمين تدريجيًا لاستخدام خدمة App Attest لتجنُّب بلوغ حدود الحصة. لمزيد من المعلومات، يُرجى الاطّلاع على مستندات Apple بعنوان الاستعداد لاستخدام خدمة App Attest.
يمكن أن يؤدي استخدام ميزة App Store Connect من Apple، كما هو موضّح في طرح تحديث إصدار على مراحل، إلى تسهيل عملية طرح App Check. هذا حل بسيط ومباشر. ومع ذلك، لا يتيح لك طرح تحديث لإصدار التطبيق على مراحل التحكّم في عملية الطرح أو تغيير سلوك التطبيقات الحالية والمحدَّثة بدون نشر إصدار جديد من التطبيق.
إحدى طرق التحكّم بشكل أكبر في طرح App Check مع App Attest هي استخدام ميزة "الإعداد عن بُعد في Firebase" لتفعيل App Check مع App Attest لنسبة مئوية من مستخدمي تطبيقك في كل مرة. قد يساعد ذلك في تجنُّب الحدّ من سرعة نقل البيانات من خوادم التصديق. يمكن استخدام "إحصاءات Google" لمراقبة تأثير الطرح على المستخدمين.
ما ستتعلمه
في هذا الدرس العملي المتعدّد الخطوات، ستتعلّم كيفية استخدام ميزة "الإعداد عن بُعد في Firebase" لطرح خدمة App Check في تطبيقك.
يستخدم هذا الدرس العملي مشروعًا على Firebase يستند إلى تطبيق التشغيل السريع DatabaseExample ومدمجًا مع خدمة App Check من Firebase، كما هو موضّح في الدرس العملي حول خدمة App Check من Firebase لمنصات Apple. يتيح تطبيق التشغيل السريع DatabaseExample للمستخدمين تسجيل الدخول وإضافة مشاركات باستخدام ميزات "قاعدة البيانات الآنية الاستجابة" من Firebase.
يمكنك أيضًا تعديل الخطوات الواردة في هذا الدرس البرمجي لاختبار تطبيقك.
المتطلبات الأساسية
المتطلبات
- Xcode 12.5 أو إصدار أحدث
- بالنسبة إلى اختبار App Attest:
- حساب على Apple Developer يتيح لك إنشاء معرّفات تطبيقات جديدة
- تطبيق يتضمّن معرّف تطبيق صريحًا مع تفعيل إمكانية استخدام App Attest. راجِع المقالتَين تسجيل معرّف تطبيق وتفعيل إمكانات التطبيق إذا كنت بحاجة إلى مساعدة في هذه العملية.
- جهاز iOS أو iPadOS متوافق مع App Attest
- مشروع Firebase يتضمّن ما يلي:
- تطبيق iOS تم إعداده (مزيد من المعلومات)
- تفعيل إحصاءات Google والإعداد عن بُعد وApp Check
- إتاحة الوصول إلى مشروع Firebase المرتبط بتطبيقك ومنح الأذونات اللازمة لاستخدام وإدارة ميزة "الإعداد عن بُعد" والاطّلاع على حساب "إحصاءات Google"
2. إنشاء موفّر شهادات مخصّص
في هذه الخطوة، سننشئ فئة موفّر مخصّصة لتقديم رمز مميّز فقط عند تفعيل App Attest. تعتمد ميزة "الإعداد عن بُعد" على مثيل تطبيق Firebase تم إعداده، ويعمل موفّر الخدمة المخصّص الذي تنفّذه في هذه الخطوة كعنصر نائب لإنهاء عملية الإعداد.
لإكمال الخطوات التالية، عليك إضافة Firebase
وFirebaseRemoteConfig
وFirebaseAnalytics
في قسم "الأُطر والمكتبات والمحتوى المضمّن" في تطبيقك على Xcode. للاطّلاع على مثال حول كيفية إجراء ذلك، يُرجى الرجوع إلى الدرس التطبيقي حول ميزة "فحص التطبيقات من Firebase" لمنصات Apple.
- أنشئ ملفًا باسم "MyAppCheckProvider" يكون فئة فرعية من
NSObject
ويتوافق مع البروتوكولAppCheckProvider
. - أضِف دالة
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()
في مرجع إطار عمل فحص التطبيقات من Firebase.
أضِف الرمز التالي إلى طريقة 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 Check على الجهاز الحالي. إذا كانت القيمة صحيحة، يحاول الرمز البرمجي الحصول على موفّر App Attest ويتعذّر عليه ذلك. في حال اجتياز عمليات التحقّق من الأخطاء هذه، سيرسل الرمز طلب الرمز المميّز إلى موفّر خدمة App Attest.
إضافة أحداث "إحصاءات Google"
من خلال إضافة أحداث "إحصاءات Google"، يمكنك الحصول على إحصاءات أفضل حول مدى نجاح طرح App Check. ستساعد "إحصاءات Google" في تحديد ما إذا كان يجب تفعيل App Attest لعدد أكبر من المستخدمين.
سجِّل حدثَين في "إحصاءات Google": AppAttestSuccess عند النجاح، وAppAttestFailure عند التعذّر. يمكن أن يساعد حدثا "إحصاءات Google" هذان في تتبُّع نجاح طرح App Check، كما يمكن أن يساعداك في تحديد ما إذا كان يجب المتابعة في طرح إصدار أكبر.
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 Factory
بعد تنفيذ منطق إعادة توجيه طلب الرمز المميّز إلى مقدّم خدمة App Attest وإضافة بعض أحداث "إحصاءات Google"، عليك تعديل MyAppCheckProviderFactory.class
الذي أنشأته في برنامج App Check for Apple Platforms التعليمي. سيستهدف هذا الصف موفّر تصحيح الأخطاء في App Check للمحاكيات، وإلا سيستهدف الموفّر المخصّص.
عدِّل الرمز التالي في الفئة MyAppCheckProviderFactory
التي أنشأتها في برنامج codelab الخاص بميزة "فحص التطبيقات من Firebase" على منصات 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، اتّبِع الخطوات التالية :
- افتح الإعداد عن بُعد لمشروعك وانقر على إضافة مَعلمة. إذا كانت هذه هي المرة الأولى التي تستخدم فيها Remote Config، انقر على إنشاء إعداد.
- في حقل اسم المَعلمة (المفتاح)، أدخِل
AppAttestEnabled
. - من القائمة المنسدلة نوع البيانات، اختَر منطقية.
- من القائمة المنسدلة القيمة التلقائية، اختَر false.
قبل النقر على "حفظ"، أنشئ قيمة شرطية لـ% 10 من المستخدمين:
- انقر على إضافة جديد > قيمة شرطية > إنشاء شرط جديد.
- في حقل الاسم، أدخِل اسم شرط.
- ضمن ينطبق إذا...، اختَر المستخدم في النسبة المئوية العشوائية، ثم <=، ثم أدخِل 10 في حقل %.
- انقر على إنشاء شرط.
اضبط القيمة الشرطية على true لكي يتم طرح App Attest على% 10 من المستخدمين.
- اضبط القيمة على true للشرط الذي أنشأته للتو.
- انقر على حفظ.
عند الانتهاء، انشر التغييرات في ميزة "الإعداد عن بُعد".
اختبار الطرح على جهازك
لاختبار قيم علامات "الإعداد عن بُعد" المختلفة على جهازك بدون تعديل رمز التطبيق، يمكنك إعداد تجربة على المَعلمة AppAttestEnabled باتّباع البرنامج التعليمي حول إنشاء تجارب "الإعداد عن بُعد في Firebase" باستخدام ميزة "اختبار A/B". يوضّح قسم البرنامج التعليمي التحقّق من صحة تجربتك على جهاز اختبار كيفية تعيين قيم مختلفة لجهاز الاختبار.
الخطوة الأخيرة هي استخدام "إحصاءات Google" لمراقبة مدى نجاح طرح App Attest.
5- مراجعة مدى نجاح طرح AppCheck
يمكنك قياس مدى نجاح عملية الطرح في لوحة بيانات "أحداث الإحصاءات". ابحث عن الحدثَين AppAttestSuccess وAppAttestFailure. قد يستغرق ظهور الأحداث في لوحة البيانات مدةً تصل إلى 24 ساعة. بدلاً من ذلك، يمكنك تفعيل تصحيح الأخطاء واستخدام DebugView للاطّلاع على أحداث تصحيح الأخطاء بشكلٍ أسرع.
يمكنك اختياريًا مراقبة لوحة بيانات Crashlytics لرصد أي زيادات في معدّلات الأعطال. لمزيد من المعلومات حول إضافة Crashlytics إلى تطبيقك، اطّلِع على مقالة البدء في استخدام Firebase Crashlytics.
بعد أن تظهر لك معظم أحداث AppAttestSuccess وعدد قليل من أحداث AppAttestFailure، سيكون ذلك مؤشرًا جيدًا على إمكانية زيادة نسبة المستخدمين الذين فعّلوا App Attest من خلال تعديل الشرط في المَعلمة AppAttestEnabled في Remote Config.
اختياري: الاستفادة من شرائح الجمهور في "إحصاءات Google"
إذا أردت الاستفادة بشكل أكبر من حدث AppAttestEnabled في "إحصاءات Google"، يمكنك إنشاء شريحة جمهور في "إحصاءات Google" لتتبُّع المستخدمين الذين تم ضبط AppAttestEnabled على "صحيح".
تم إصدار App Attest مع نظام التشغيل iOS 14.0. قد لا يكون بعض المستخدمين على هذا الإصدار، وبالتالي لن يكونوا مؤهّلين لاستخدام App Attest. يمكنك تسجيل حدث آخر في "إحصاءات Google" لتتبُّع هؤلاء المستخدمين، ثم استهداف شريحة الجمهور هذه بطريقة أخرى لإثبات صحة الجهاز، مثل DeviceCheck.
اختياري: استخدام Crashlytics لمراقبة الأعطال
لفهم مدى استقرار تطبيقك بشكل أفضل أثناء طرحه، استخدِم Firebase Crashlytics لتتبُّع الأعطال والأخطاء غير الفادحة.
6. تهانينا!
تم طرح App Check بنجاح باستخدام ميزة "الإعداد عن بُعد" 🎉