المصادقة مع Firebase على أنظمة Apple الأساسية باستخدام رقم هاتف

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

إنّ أسهل طريقة لإضافة رقم الهاتف المستخدَم لتسجيل الدخول إلى تطبيقك هي استخدام FirebaseUI، والذي يتضمّن أداة لتسجيل الدخول تعمل على تنفيذ مسارات تسجيل الدخول على الهاتف تسجيل الدخول باستخدام الأرقام، بالإضافة إلى تسجيل الدخول المستند إلى كلمة المرور والدخول الموحّد. هذا المستند كيفية تنفيذ عملية تسجيل الدخول إلى رقم هاتف باستخدام حزمة تطوير البرامج (SDK) لمنصّة Firebase

قبل البدء

  1. إذا لم تكن قد ربطت تطبيقك بمشروعك على Firebase، يمكنك إجراء ذلك من وحدة تحكُّم Firebase.
  2. يمكنك استخدام "مدير حزم Swift" لتثبيت اعتماديات Firebase وإدارتها.

    1. في Xcode، انتقِل إلى File (ملف) > بعد فتح مشروع التطبيق الخاص بك. إضافة حِزم
    2. أضِف مستودع حزمة تطوير البرامج (SDK) لمنصّات Firebase Apple عندما يُطلب منك ذلك:
    3.   https://github.com/firebase/firebase-ios-sdk.git
    4. اختر مكتبة مصادقة Firebase.
    5. أضِف العلامة -ObjC إلى القسم علامات الروابط الأخرى في إعدادات إصدار هدفك.
    6. عند الانتهاء، سيبدأ Xcode تلقائيًا في حل وتنزيل ملف والتبعيات في الخلفية.

المخاوف المرتبطة بالأمان

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

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

تفعيل ميزة "تسجيل الدخول باستخدام رقم الهاتف" لمشروع Firebase

لتسجيل دخول المستخدمين من خلال الرسائل القصيرة SMS، يجب أولاً تفعيل تسجيل الدخول باستخدام رقم الهاتف. لمشروعك على Firebase وهي:

  1. في وحدة تحكُّم Firebase، افتح قسم المصادقة.
  2. في صفحة طريقة تسجيل الدخول، فعِّل رقم الهاتف. تسجيل الدخول.

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

تفعيل التحقق من التطبيقات

لاستخدام مصادقة رقم الهاتف، يجب أن يكون Firebase قادرًا على التحقق من أن طلبات تسجيل الدخول إلى رقم الهاتف الواردة من تطبيقك. هناك طريقتان تُحقِّق مصادقة Firebase ما يلي:

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

    لنظام التشغيل iOS 8.0 والإصدارات الأحدث، لا تتطلب الإشعارات الصامتة صريحة موافقة المستخدم، وبالتالي لا تتأثر برفض مستخدم إشعارات أسماء نقاط الوصول (APN) في التطبيق وبالتالي، لا يحتاج التطبيق إلى طلب من المستخدم إذن بتلقّي الإشعارات الفورية عند تنفيذ هاتف Firebase مصادقة الرقم

  • التحقق من CAPTCHA: في حالة عدم إرسال أو استلام لا يمكن إرسال إشعار فوري صامت، كما هو الحال عندما يكون لدى المستخدم إيقاف تحديث الخلفية لتطبيقك، أو عند اختبار التطبيق على محاكي iOS، تستخدم مصادقة Firebase إكمال التحقق من reCAPTCHA على أجهزة iOS تدفق تسجيل الدخول عبر الهاتف. يمكن في كثير من الأحيان إكمال تحدّي reCAPTCHA. دون أن يضطر المستخدم إلى حل أي شيء.

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

بدء تلقّي إشعارات صامتة

لتفعيل إشعارات أسماء نقاط الوصول (APN) للاستخدام مع مصادقة Firebase:

  1. في Xcode، وتفعيل الإشعارات الفورية لمشروعك
  2. حمِّل مفتاح مصادقة أسماء نقاط الوصول إلى Firebase. إذا لم يكن لديك مفتاح مصادقة لأسماء نقاط الوصول (APN)، احرص على إنشاء مفتاح في مركز أعضاء مطوّري برامج Apple

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

    2. في مفتاح مصادقة أسماء نقاط الوصول (APN) ضمن ضبط تطبيق iOS، انقر على تحميل .

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

    إذا كانت لديك شهادة أسماء نقاط الوصول (APN) من قبل، يمكنك تحميل الشهادة. بدلاً من ذلك.

إعداد اختبار reCAPTCHA

لتفعيل حزمة تطوير البرامج (SDK) لمنصة Firebase من استخدام إثبات الملكية باستخدام reCAPTCHA، يُرجى اتّباع الخطوات التالية:

  1. إضافة مخططات عناوين URL مخصصة إلى مشروع Xcode:
    1. افتح إعدادات المشروع: انقر نقرًا مزدوجًا على اسم المشروع في العرض الشجري الأيسر. اختَر تطبيقك من قسم TARGETS، ثم واختَر علامة التبويب المعلومات، ووسِّع القسم أنواع عناوين URL.
    2. انقر على الزر + وأضِف رقم تعريف التطبيق المشفر كعنوان URL. . يمكنك العثور على رقم تعريف التطبيق المشفر على عام "الإعدادات" في وحدة تحكُّم Firebase، في قسم نظام التشغيل iOS التطبيق. اترك الحقول الأخرى فارغة.

      عند الانتهاء، من المفترض أن تبدو التهيئة بشكل مشابه التالية (ولكن مع القيم الخاصة بالتطبيقات):

      لقطة شاشة لواجهة إعداد مخطط عنوان URL المخصّص في Xcode
  2. اختياري: إذا كنت تريد تخصيص طريقة عرض تطبيقك SFSafariViewController عند عرض reCAPTCHA للمستخدم، يمكنك إنشاء تصميم مخصّص تتوافق مع بروتوكول AuthUIDelegate، وتمريرها إلى verifyPhoneNumber(_:uiDelegate:completion:)

إرسال رمز تحقُّق إلى هاتف المستخدم

لبدء تسجيل الدخول باستخدام رقم الهاتف، اعرض للمستخدم واجهة تطلب منك تقديم رقم هاتفه، ثم الاتصال verifyPhoneNumber(_:uiDelegate:completion:) لطلب Firebase إرسال رمز مصادقة إلى هاتف المستخدم عبر رسالة قصيرة SMS:

  1. الحصول على رقم هاتف المستخدم

    تختلف المتطلبات القانونية، ولكن تُعتبر من أفضل الممارسات وتحديد التوقعات للمستخدمين، يجب عليك إخبارهم بأنه إذا استخدموا تسجيل الدخول عبر الهاتف، فقد يتلقون رسالة قصيرة SMS للتحقق و1 الأسعار.

  2. الاتصال برقم verifyPhoneNumber(_:uiDelegate:completion:)، المرور إليه رقم هاتف المستخدم.

    Swift

    PhoneAuthProvider.provider()
      .verifyPhoneNumber(phoneNumber, uiDelegate: nil) { verificationID, error in
          if let error = error {
            self.showMessagePrompt(error.localizedDescription)
            return
          }
          // Sign in using the verificationID and the code sent to the user
          // ...
      }

    Objective-C

    [[FIRPhoneAuthProvider provider] verifyPhoneNumber:userInput
                                            UIDelegate:nil
                                            completion:^(NSString * _Nullable verificationID, NSError * _Nullable error) {
      if (error) {
        [self showMessagePrompt:error.localizedDescription];
        return;
      }
      // Sign in using the verificationID and the code sent to the user
      // ...
    }];

    تكون الطريقة verifyPhoneNumber إعادة مشاركة: إذا تم استدعاؤها عدة مرات، مثل في طريقة onAppear لطريقة العرض، لن يكون للطريقة verifyPhoneNumber إرسال رسالة قصيرة SMS ثانية ما لم تنتهِ مهلة الطلب الأصلي

    عند الاتصال بـ verifyPhoneNumber(_:uiDelegate:completion:)، يرسل Firebase إشعارًا فوريًا صامتًا إلى تطبيقك أو يُصدر لتحدي reCAPTCHA للمستخدم. بعد أن يتلقّى تطبيقك أو إكمال المستخدم لتحدي reCAPTCHA، Firebase إرسال رسالة قصيرة SMS تحتوي على رمز المصادقة إلى رقم الهاتف المحدّد وتمرير رقم تعريف إثبات الهوية إلى سجلّ نشاطك التجاري الأخرى. ستحتاج إلى كل من رمز إثبات الهوية ورمز التحقق مُعرّف لتسجيل دخول المستخدم.

    يمكن أيضًا ترجمة رسالة SMS المرسلة من Firebase من خلال تحديد لغة المصادقة عبر السمة languageCode في المصادقة مثال.

    Swift

     // Change language code to french.
     Auth.auth().languageCode = "fr";
    

    Objective-C

     // Change language code to french.
     [FIRAuth auth].languageCode = @"fr";
    
  3. احفظ رقم تعريف إثبات الهوية واستعادته عند تحميل تطبيقك. من خلال القيام بذلك، يمكنك التأكد من أنّه لا يزال لديك رقم تعريف صالح لإثبات ملكية تطبيقك. إنهاء قبل أن يكمل المستخدم تدفق تسجيل الدخول (على سبيل المثال، بينما التبديل إلى تطبيق الرسائل القصيرة SMS).

    يمكنك الاحتفاظ بمعرّف إثبات الملكية بالطريقة التي تريدها. هناك طريقة بسيطة وهي حفظ رقم تعريف إثبات الهوية باستخدام الكائن NSUserDefaults:

    Swift

    UserDefaults.standard.set(verificationID, forKey: "authVerificationID")
    

    Objective-C

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:verificationID forKey:@"authVerificationID"];
    

    بعد ذلك، يمكنك استعادة القيمة المحفوظة:

    Swift

    let verificationID = UserDefaults.standard.string(forKey: "authVerificationID")
    

    Objective-C

    NSString *verificationID = [defaults stringForKey:@"authVerificationID"];
    

إذا كانت المكالمة مع "verifyPhoneNumber(_:uiDelegate:completion:)" يمكنك مطالبة المستخدم بكتابة رمز التحقق عند استلامه في رسالة SMS

سجّل دخول المستخدم باستخدام رمز التحقق

بعد أن يقدّم المستخدم رمز التحقّق الوارد في الرسالة القصيرة SMS لتطبيقك سجِّل دخول المستخدم من خلال إنشاء FIRPhoneAuthCredential كائن من رمز التحقّق ورقم تعريف إثبات الهوية وتمرير ذلك العنصر إلى signInWithCredential:completion:.

  1. احصل على رمز إثبات الهوية من المستخدم.
  2. إنشاء عنصر FIRPhoneAuthCredential من عملية إثبات الملكية الرمز ورقم تعريف التحقق.

    Swift

    let credential = PhoneAuthProvider.provider().credential(
      withVerificationID: verificationID,
      verificationCode: verificationCode
    )

    Objective-C

    FIRAuthCredential *credential = [[FIRPhoneAuthProvider provider]
        credentialWithVerificationID:verificationID
                    verificationCode:userInput];
  3. تسجيل دخول المستخدم باستخدام الكائن FIRPhoneAuthCredential:

    Swift

    Auth.auth().signIn(with: credential) { authResult, error in
        if let error = error {
          let authError = error as NSError
          if isMFAEnabled, authError.code == AuthErrorCode.secondFactorRequired.rawValue {
            // The user is a multi-factor user. Second factor challenge is required.
            let resolver = authError
              .userInfo[AuthErrorUserInfoMultiFactorResolverKey] as! MultiFactorResolver
            var displayNameString = ""
            for tmpFactorInfo in resolver.hints {
              displayNameString += tmpFactorInfo.displayName ?? ""
              displayNameString += " "
            }
            self.showTextInputPrompt(
              withMessage: "Select factor to sign in\n\(displayNameString)",
              completionBlock: { userPressedOK, displayName in
                var selectedHint: PhoneMultiFactorInfo?
                for tmpFactorInfo in resolver.hints {
                  if displayName == tmpFactorInfo.displayName {
                    selectedHint = tmpFactorInfo as? PhoneMultiFactorInfo
                  }
                }
                PhoneAuthProvider.provider()
                  .verifyPhoneNumber(with: selectedHint!, uiDelegate: nil,
                                     multiFactorSession: resolver
                                       .session) { verificationID, error in
                    if error != nil {
                      print(
                        "Multi factor start sign in failed. Error: \(error.debugDescription)"
                      )
                    } else {
                      self.showTextInputPrompt(
                        withMessage: "Verification code for \(selectedHint?.displayName ?? "")",
                        completionBlock: { userPressedOK, verificationCode in
                          let credential: PhoneAuthCredential? = PhoneAuthProvider.provider()
                            .credential(withVerificationID: verificationID!,
                                        verificationCode: verificationCode!)
                          let assertion: MultiFactorAssertion? = PhoneMultiFactorGenerator
                            .assertion(with: credential!)
                          resolver.resolveSignIn(with: assertion!) { authResult, error in
                            if error != nil {
                              print(
                                "Multi factor finanlize sign in failed. Error: \(error.debugDescription)"
                              )
                            } else {
                              self.navigationController?.popViewController(animated: true)
                            }
                          }
                        }
                      )
                    }
                  }
              }
            )
          } else {
            self.showMessagePrompt(error.localizedDescription)
            return
          }
          // ...
          return
        }
        // User is signed in
        // ...
    }

    Objective-C

    [[FIRAuth auth] signInWithCredential:credential
                              completion:^(FIRAuthDataResult * _Nullable authResult,
                                           NSError * _Nullable error) {
        if (isMFAEnabled && error && error.code == FIRAuthErrorCodeSecondFactorRequired) {
          FIRMultiFactorResolver *resolver = error.userInfo[FIRAuthErrorUserInfoMultiFactorResolverKey];
          NSMutableString *displayNameString = [NSMutableString string];
          for (FIRMultiFactorInfo *tmpFactorInfo in resolver.hints) {
            [displayNameString appendString:tmpFactorInfo.displayName];
            [displayNameString appendString:@" "];
          }
          [self showTextInputPromptWithMessage:[NSString stringWithFormat:@"Select factor to sign in\n%@", displayNameString]
                               completionBlock:^(BOOL userPressedOK, NSString *_Nullable displayName) {
           FIRPhoneMultiFactorInfo* selectedHint;
           for (FIRMultiFactorInfo *tmpFactorInfo in resolver.hints) {
             if ([displayName isEqualToString:tmpFactorInfo.displayName]) {
               selectedHint = (FIRPhoneMultiFactorInfo *)tmpFactorInfo;
             }
           }
           [FIRPhoneAuthProvider.provider
            verifyPhoneNumberWithMultiFactorInfo:selectedHint
            UIDelegate:nil
            multiFactorSession:resolver.session
            completion:^(NSString * _Nullable verificationID, NSError * _Nullable error) {
              if (error) {
                [self showMessagePrompt:error.localizedDescription];
              } else {
                [self showTextInputPromptWithMessage:[NSString stringWithFormat:@"Verification code for %@", selectedHint.displayName]
                                     completionBlock:^(BOOL userPressedOK, NSString *_Nullable verificationCode) {
                 FIRPhoneAuthCredential *credential =
                     [[FIRPhoneAuthProvider provider] credentialWithVerificationID:verificationID
                                                                  verificationCode:verificationCode];
                 FIRMultiFactorAssertion *assertion = [FIRPhoneMultiFactorGenerator assertionWithCredential:credential];
                 [resolver resolveSignInWithAssertion:assertion completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
                   if (error) {
                     [self showMessagePrompt:error.localizedDescription];
                   } else {
                     NSLog(@"Multi factor finanlize sign in succeeded.");
                   }
                 }];
               }];
              }
            }];
         }];
        }
      else if (error) {
        // ...
        return;
      }
      // User successfully signed in. Get user data from the FIRUser object
      if (authResult == nil) { return; }
      FIRUser *user = authResult.user;
      // ...
    }];

الاختبار باستخدام أرقام هواتف خيالية

ويمكنك إعداد أرقام هواتف خيالية للتطوير من خلال وحدة تحكُّم Firebase. إجراء الاختبارات باستخدام هاتف وهمي الأرقام التالية:

  • يمكنك اختبار مصادقة رقم الهاتف بدون استهلاك حصة الاستخدام.
  • اختبار مصادقة رقم الهاتف بدون إرسال رسالة SMS فعلية.
  • يمكنك إجراء اختبارات متتالية باستخدام رقم الهاتف نفسه بدون تقييد. هذا النمط إلى تقليل مخاطر الرفض أثناء عملية مراجعة متجر التطبيقات في حال استخدام المُراجع رقم الهاتف نفسه للاختبار.
  • الاختبار بسهولة في بيئات التطوير دون أي جهد إضافي، مثل والقدرة على التطوير باستخدام محاكي iOS أو محاكي Android بدون "خدمات Google Play".
  • كتابة اختبارات الدمج بدون حظرها من خلال فحوصات الأمان التي يتم تطبيقها عادةً على أرقام هواتف حقيقية في بيئة إنتاج.

يجب أن تستوفي أرقام الهواتف الخيالية المتطلبات التالية:

  1. احرص على استخدام أرقام هواتف خيالية بالفعل، وغير موجودة. لا تسمح لك مصادقة Firebase بضبط أرقام الهواتف الحالية التي يستخدمها مستخدمون حقيقيون كأرقام اختبار. أحد الخيارات المتاحة هو استخدام 555 رقمًا يبدأ ببادئة كأرقام هواتف تجريبية في الولايات المتحدة، على سبيل المثال: +1 650-555-3434
  2. يجب أن تكون أرقام الهواتف منسَّقة بشكل صحيح حسب الطول القيود. سيظلان يخضعان لعملية التحقق نفسها مثل رقم هاتف المستخدم الحقيقي.
  3. يمكنك إضافة ما يصل إلى 10 أرقام هواتف لعملية التطوير.
  4. استخدِم أرقام هواتف أو رموزًا اختبارية يصعب تخمينها وتغييرها. بشكل متكرر.

إنشاء أرقام هواتف ورموز تحقُّق وهمية

  1. في وحدة تحكُّم Firebase، افتح قسم المصادقة.
  2. في علامة التبويب طريقة تسجيل الدخول، فعِّل مقدِّم خدمة الهاتف إذا لم يسبق لك إجراء ذلك.
  3. افتح قائمة أكورديون أرقام الهاتف للاختبار.
  4. أدخِل رقم الهاتف الذي تريد اختباره، على سبيل المثال: +1 650-555-3434.
  5. أدخِل رمز التحقّق المكوَّن من 6 أرقام لهذا الرقم تحديدًا، على سبيل المثال: 654321.
  6. أضِف الرقم. إذا كانت هناك حاجة، فيمكنك حذف رقم الهاتف رمزه عن طريق التمرير فوق الصف المقابل والنقر على أيقونة المهملات.

الاختبار اليدوي

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

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

عند اكتمال تسجيل الدخول، يتم إنشاء مستخدم Firebase برقم الهاتف هذا. تشير رسالة الأشكال البيانية للمستخدم نفس السلوك والخصائص مثل مستخدم رقم هاتف حقيقي، ويمكنه الوصول قاعدة بيانات الوقت الفعلي/Cloud Firestore والخدمات الأخرى بالطريقة نفسها. تم إنشاء الرمز المميز للمعرّف أثناء لهذه العملية نفس توقيع مستخدم رقم الهاتف الحقيقي.

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

اختبار الدمج

توفّر مصادقة Firebase واجهات برمجة تطبيقات للمساعدة في كتابة اختبارات التكامل، بالإضافة إلى الاختبار اليدوي لاختبار مصادقة الهاتف. توقِف واجهات برمجة التطبيقات هذه التحقّق من التطبيقات من خلال إيقاف reCAPTCHA. على الويب والإشعارات الصامتة في iOS. وهذا يجعل اختبار التشغيل الآلي ممكنًا في هذه التدفقات وأسهل في التنفيذ. بالإضافة إلى ذلك، تساعد في توفير إمكانية اختبار التطبيقات الفورية خطوات إثبات الملكية على Android

على أجهزة iOS، يجب ضبط الإعداد appVerificationDisabledForTesting على TRUE قبل الاتصال بـ verifyPhoneNumber. تتم معالجة هذه المعلومات بدون الحاجة إلى أي رمز مميّز لأسماء نقاط الوصول (APN) أو إرسال إشعارات فورية صامتة في الخلفية، ما يسهِّل اختبارها في محاكي. يؤدي ذلك أيضًا إلى إيقاف مسار reCAPTCHA الاحتياطي.

لاحظ أنه في حالة تعطيل التحقق من التطبيقات، فإن استخدام رقم هاتف غير حقيقي سوف تعذّر إكمال عملية تسجيل الدخول. لا يمكن استخدام سوى أرقام الهواتف الخيالية فقط مع واجهة برمجة التطبيقات هذه.

Swift

let phoneNumber = "+16505554567"

// This test verification code is specified for the given test phone number in the developer console.
let testVerificationCode = "123456"

Auth.auth().settings.isAppVerificationDisabledForTesting = TRUE
PhoneAuthProvider.provider().verifyPhoneNumber(phoneNumber, uiDelegate:nil) {
                                                            verificationID, error in
    if (error) {
      // Handles error
      self.handleError(error)
      return
    }
    let credential = PhoneAuthProvider.provider().credential(withVerificationID: verificationID ?? "",
                                                               verificationCode: testVerificationCode)
    Auth.auth().signInAndRetrieveData(with: credential) { authData, error in
      if (error) {
        // Handles error
        self.handleError(error)
        return
      }
      _user = authData.user
    }];
}];

Objective-C

NSString *phoneNumber = @"+16505554567";

// This test verification code is specified for the given test phone number in the developer console.
NSString *testVerificationCode = @"123456";

[FIRAuth auth].settings.appVerificationDisabledForTesting = YES;
[[FIRPhoneAuthProvider provider] verifyPhoneNumber:phoneNumber
                                        completion:^(NSString *_Nullable verificationID,
                                                     NSError *_Nullable error) {
    if (error) {
      // Handles error
      [self handleError:error];
      return;
    }
    FIRAuthCredential *credential =
        [FIRPhoneAuthProvider credentialWithVerificationID:verificationID
                                          verificationCode:testVerificationCode];
    [FIRAuth auth] signInWithAndRetrieveDataWithCredential:credential
                                                completion:^(FIRUser *_Nullable user,
                                                             NSError *_Nullable error) {
      if (error) {
        // Handles error
        [self handleError:error];
        return;
      }
      _user = user;
    }];
}];

الملحق: استخدام تسجيل الدخول عبر الهاتف بدون تحريك

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

إذا كنت تفضّل عدم استخدام الدوران، يمكنك إيقافه عن طريق إضافة العلامة FirebaseAppDelegateProxyEnabled إلى ملف Info.plist لتطبيقك و يَتِمُّ الْآنْ ضَبْطُهُ عَلَى NO. تجدر الإشارة إلى أنّ ضبط هذه العلامة على NO تعمل أيضًا على إيقاف التبديل بين منتجات Firebase الأخرى، بما في ذلك المراسلة عبر السحابة الإلكترونية من Firebase.

في حال إيقاف الدوّار، يجب ضبط الرمز المميّز الخاص بـ "أسماء نقاط الوصول" (APN) بوضوح. ودفع الإشعارات، وعنوان URL لإعادة توجيه المخطط المخصص إلى مصادقة Firebase.

إذا كنت تنشئ تطبيق SwiftUI، ينبغي لك أيضًا تمرير الرمز المميز للجهاز لأسماء نقاط الوصول (APNs) صراحةً، ودفع الإشعارات، وعنوان URL لإعادة توجيه المخطط المخصص إلى مصادقة Firebase.

للحصول على الرمز المميّز للجهاز من أسماء نقاط الوصول (APN)، عليك تنفيذ application(_:didRegisterForRemoteNotificationsWithDeviceToken:) وفيها، يتم تمرير الرمز المميز للجهاز إلىAuth طريقة setAPNSToken(_:type:)

Swift

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
  // Pass device token to auth
  Auth.auth().setAPNSToken(deviceToken, type: .prod)

  // Further handling of the device token if needed by the app
  // ...
}

Objective-C

- (void)application:(UIApplication *)application
    didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
  // Pass device token to auth.
  [[FIRAuth auth] setAPNSToken:deviceToken type:FIRAuthAPNSTokenTypeProd];
  // Further handling of the device token if needed by the app.
}

للتعامل مع الإشعارات الفورية، يُرجى الانتقال إلى application(_:didReceiveRemoteNotification:fetchCompletionHandler:): يمكنك التحقّق من الإشعارات ذات الصلة بمصادقة Firebase من خلال طلب طريقة canHandleNotification(_:) لـ Auth.

Swift

func application(_ application: UIApplication,
    didReceiveRemoteNotification notification: [AnyHashable : Any],
    fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
  if Auth.auth().canHandleNotification(notification) {
    completionHandler(.noData)
    return
  }
  // This notification is not auth related; it should be handled separately.
}

Objective-C

- (void)application:(UIApplication *)application
    didReceiveRemoteNotification:(NSDictionary *)notification
          fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
  // Pass notification to auth and check if they can handle it.
  if ([[FIRAuth auth] canHandleNotification:notification]) {
    completionHandler(UIBackgroundFetchResultNoData);
    return;
  }
  // This notification is not auth related; it should be handled separately.
}

للتعامل مع عنوان URL لإعادة توجيه المخطط المخصص، نفذ application(_:open:options:) وفيها، أرسِل عنوان URL إلى عنوان URL الخاص بـ Auth طريقة canHandleURL(_:)

Swift

func application(_ application: UIApplication, open url: URL,
    options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool {
  if Auth.auth().canHandle(url) {
    return true
  }
  // URL not auth related; it should be handled separately.
}

Objective-C

- (BOOL)application:(UIApplication *)app
            openURL:(NSURL *)url
            options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options {
  if ([[FIRAuth auth] canHandleURL:url]) {
    return YES;
  }
  // URL not auth related; it should be handled separately.
}

إذا كنت تستخدم SwiftUI أو UISceneDelegate، لمعالجة عنوان URL لإعادة التوجيه، عليك تنفيذ scene(_:openURLContexts:)، وفيها، تمرير عنوان URL إلى Auth canHandleURL(_:).

Swift

func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
  for urlContext in URLContexts {
      let url = urlContext.url
      Auth.auth().canHandle(url)
  }
  // URL not auth related; it should be handled separately.
}

Objective-C

- (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts {
  for (UIOpenURLContext *urlContext in URLContexts) {
    [FIRAuth.auth canHandleURL:urlContext.url];
    // URL not auth related; it should be handled separately.
  }
}

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

بعد تسجيل المستخدم الدخول لأول مرة، يتم إنشاء حساب مستخدم جديد المرتبطة ببيانات الاعتماد - أي اسم المستخدم وكلمة المرور، أو الرقم أو معلومات مقدم المصادقة - المستخدم الذي سجّل الدخول باستخدامه. هذا الجديد كجزء من مشروع Firebase، ويمكن استخدامه لتحديد مستخدم في كل تطبيق في مشروعك، بغض النظر عن كيفية تسجيل دخوله.

  • في تطبيقاتك، يمكنك الحصول على معلومات الملف الشخصي الأساسية للمستخدم من User . راجع إدارة المستخدمين.

  • في "قاعدة بيانات Firebase في الوقت الفعلي" وCloud Storage قواعد الأمان، يمكنك الحصول على معرّف المستخدم الفريد للمستخدم الذي سجّل الدخول من المتغير auth، واستخدامها للتحكم في البيانات التي يمكن للمستخدم الوصول إليها

يمكنك السماح للمستخدمين بتسجيل الدخول إلى تطبيقك باستخدام طرق مصادقة متعددة. موفِّري خدمة المصادقة من خلال ربط بيانات اعتماد موفر المصادقة حساب مستخدم حالي

لتسجيل خروج مستخدم، اتصل بالرقم signOut:

Swift

let firebaseAuth = Auth.auth()
do {
  try firebaseAuth.signOut()
} catch let signOutError as NSError {
  print("Error signing out: %@", signOutError)
}

Objective-C

NSError *signOutError;
BOOL status = [[FIRAuth auth] signOut:&signOutError];
if (!status) {
  NSLog(@"Error signing out: %@", signOutError);
  return;
}

قد تحتاج أيضًا إلى إضافة رمز معالجة الأخطاء للنطاق الكامل للمصادقة الأخطاء. يُرجى الاطّلاع على التعامل مع الأخطاء.