0Pricing
Swift Academy · درس

المصادقة البيومترية

صادقوا على المستخدمين باستخدام Face ID وTouch ID

المصادقة البيومترية درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 4 دروس في المجموع.

القياسات الحيوية باستخدام LocalAuthentication

يتيح Face ID وTouch ID للمستخدمين إثبات هويتهم دون كتابة كلمة مرور. ويعرض إطار العمل LocalAuthentication هذه الإمكانية عبر LAContext، الذي يقيّم سياسة مصادقة ويخبرك ما إذا كان المستخدم قد اجتازها.

import LocalAuthentication
let context = LAContext()
// One LAContext object drives a single auth attempt

التحقق من التوفر أولًا

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

import LocalAuthentication
func canUseBiometrics() -> Bool {
    let context = LAContext()
    var error: NSError?
    return context.canEvaluatePolicy(
        .deviceOwnerAuthenticationWithBiometrics,
        error: &error)
}

السياستان

تتطلب .deviceOwnerAuthenticationWithBiometrics استخدام Face ID أو Touch ID دون خيار الرجوع إلى رمز الدخول. أما .deviceOwnerAuthentication فتحاول استخدام القياسات الحيوية، ثم تعود إلى رمز دخول الجهاز. اختر السياسة بناءً على ما إذا كان قبول رمز الدخول مناسبًا.

import LocalAuthentication
// Biometrics only (no passcode fallback):
let strict = LAPolicy.deviceOwnerAuthenticationWithBiometrics
// Biometrics with passcode fallback:
let lenient = LAPolicy.deviceOwnerAuthentication
_ = (strict, lenient)

تقييم السياسة

تنفّذ evaluatePolicy المصادقة وتعرض ورقة القياسات الحيوية الخاصة بالنظام. وتشرح سلسلة localizedReason للمستخدم سبب طلبك للمصادقة. ويعيد الشكل غير المتزامن قيمة Bool أو يرمي خطأً.

import LocalAuthentication
func authenticate() async -> Bool {
    let context = LAContext()
    do {
        return try await context.evaluatePolicy(
            .deviceOwnerAuthentication,
            localizedReason:
                String(localized: "Unlock your account"))
    } catch {
        return false
    }
}

اكتشاف نوع القياسات الحيوية

بعد استدعاء canEvaluatePolicy، يخبرك context.biometryType ما إذا كان الجهاز يستخدم .faceID أو .touchID أو .opticID أو .none. استخدمه لعرض الأيقونة والصياغة الصحيحتين في واجهة المستخدم الخاصة بك.

import LocalAuthentication
func biometryLabel() -> String {
    let context = LAContext()
    _ = context.canEvaluatePolicy(
        .deviceOwnerAuthenticationWithBiometrics, error: nil)
    switch context.biometryType {
    case .faceID:  return "Face ID"
    case .touchID: return "Touch ID"
    case .opticID: return "Optic ID"
    default:       return "Passcode"
    }
}

معالجة الأخطاء

تصل حالات الفشل على شكل رموز LAError: .userCancel عند إلغاء المستخدم، و.userFallback عند اختيار رمز الدخول، و.biometryLockout بعد عدد كبير من المحاولات الفاشلة، و.biometryNotEnrolled عند عدم تسجيل القياسات الحيوية. فرّع المعالجة بناءً على هذه الحالات لتقديم إرشادات مفيدة بدلًا من رسالة فشل عامة.

import LocalAuthentication
func describe(_ error: Error) -> String {
    guard let la = error as? LAError else { return "failed" }
    switch la.code {
    case .userCancel:        return "cancelled"
    case .biometryLockout:   return "locked out"
    case .biometryNotEnrolled: return "not set up"
    default:                 return "failed"
    }
}

سلسلة استخدام Face ID

لاستخدام Face ID، يجب إضافة NSFaceIDUsageDescription إلى Info.plist مع توضيح السبب. ويؤدي حذفها إلى تعطل التطبيق عند أول تقييم لسياسة Face ID. ولا يحتاج Touch ID إلى هذا المفتاح.

// Info.plist:
// NSFaceIDUsageDescription =
//   "We use Face ID to unlock your saved passwords."
let required = "NSFaceIDUsageDescription is mandatory"
_ = required

تخصيص ورقة المصادقة

يمكنك تخصيص الطلب: تعيد localizedCancelTitle تسمية زر الإلغاء، وتضبط localizedFallbackTitle خيار الرجوع أو تخفيه عند تركها فارغة. ويؤدي ضبط عنوان الرجوع على قيمة فارغة إلى إخفاء خيار رمز الدخول.

import LocalAuthentication
func configured() -> LAContext {
    let context = LAContext()
    context.localizedCancelTitle =
        String(localized: "Not now")
    context.localizedFallbackTitle = "" // hide fallback
    return context
}

إعادة استخدام مصادقة ناجحة

يعيد كل استدعاء لـ evaluatePolicy طلب المصادقة افتراضيًا. ويتيح ضبط touchIDAuthenticationAllowableReuseDuration أن يفي إلغاء قفل ناجح حديث بعملية تحقق لاحقة دون عرض طلب جديد، وهو مفيد لتجميع الإجراءات الحساسة ضمن فترة قصيرة.

import LocalAuthentication
func reusableContext() -> LAContext {
    let context = LAContext()
    context.touchIDAuthenticationAllowableReuseDuration = 30
    return context
}

القياسات الحيوية مقابل تقييد Keychain

يتحقق LAContext من هوية المستخدم، لكنه لا يحمي البيانات بحد ذاته. ولتحقيق أمان فعلي، اقرنه بـ SecAccessControl في Keychain حتى يتعذر فك تشفير السر برمجيًا إلى أن تنجح المصادقة، بدلًا من مجرد إخفائه خلف قيمة Bool تم التحقق منها.

import LocalAuthentication
// A bare evaluatePolicy == true is bypassable if your
// logic is tampered with. Prefer SecAccessControl so
// the data is encrypted until auth succeeds.
let pairing = "combine LAContext with Keychain ACL"
_ = pairing

تدفق إلغاء قفل متكامل

اجمع بين التحقق من التوفر، والرسائل الملائمة لنوع القياسات الحيوية، والتقييم، ومعالجة الأخطاء في روتين متين واحد يمكن لواجهة المستخدم استدعاؤه.

import LocalAuthentication
func unlock() async -> Bool {
    let context = LAContext()
    var err: NSError?
    guard context.canEvaluatePolicy(
        .deviceOwnerAuthentication, error: &err) else {
        return false
    }
    return (try? await context.evaluatePolicy(
        .deviceOwnerAuthentication,
        localizedReason:
            String(localized: "Access your vault"))) ?? false
}

اختبار سريع

تذكّر الفرق بين السياستين الرئيسيتين.

مراجعة

لقد تعلمت المصادقة بالقياسات الحيوية:

  • استخدم LAContext واستدعِ canEvaluatePolicy قبل evaluatePolicy.
  • تقتصر .deviceOwnerAuthenticationWithBiometrics على القياسات الحيوية، بينما تضيف .deviceOwnerAuthentication خيار الرجوع إلى رمز الدخول.
  • اقرأ biometryType لاختيار الصياغة الصحيحة، وعالج رموز LAError مثل .biometryLockout.
  • أضف NSFaceIDUsageDescription، واقرن ذلك بـ SecAccessControl في Keychain لتحقيق حماية فعلية.

الأسئلة الشائعة

هل درس «المصادقة البيومترية» مجاني؟

نعم — نص درس «المصادقة البيومترية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.

ماذا ستتعلم في «المصادقة البيومترية»؟

صادقوا على المستخدمين باستخدام Face ID وTouch ID تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟

لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «المصادقة البيومترية»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟

نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. تخزين الأسرار في Keychain
  2. التحكم في الوصول إلى Keychain
  3. المصادقة البيومترية
  4. حماية البيانات والتشفير
← العودة إلى Swift Academy