المصادقة باستخدام تسجيل الدخول بحساب Google على أنظمة Apple الأساسية

يمكنك السماح للمستخدمين بالمصادقة باستخدام Firebase من خلال حساباتهم على Google عن طريق دمج ميزة "تسجيل الدخول باستخدام حساب Google" في تطبيقك.

للحصول على مساعدة من الذكاء الاصطناعي، انسخ الطلب أدناه إلى وكيل الترميز المستنِد إلى الذكاء الاصطناعي (مثل Antigravity وClaude Code وCodex وCursor). يمكنك تخصيص الطلب وتكراره مع الوكيل. يمكنك الانتقال إلى مهارات وكلاء Firebase للحصول على معلومات مفصّلة حول التثبيت.

Help me use Firebase in my app.
1. Make sure that **Firebase agent skills** are installed and updated. For Claude Code, Codex, or Cursor agents, help me install the Firebase plugin. For other agents, run `npx skills add firebase/agent-skills`. Always try to use **Firebase agent skills** for Firebase-related tasks.
2. Help me set up and use Firebase Authentication with Google Sign-In in my app.

قبل البدء

استخدِم أداة Swift Package Manager لتثبيت الملحقات المطلوبة في Firebase وإدارتها.

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

إضافة حزمة تطوير البرامج (SDK) الخاصة بخدمة "تسجيل الدخول باستخدام حساب Google" إلى مشروعك

  1. في Xcode، بعد فتح مشروع تطبيقك، انتقِل إلى ملف > إضافة حِزم (File > Add Packages).

  2. عندما يُطلب منك ذلك، أضِف مستودع حزمة تطوير البرامج (SDK) لخدمة "تسجيل الدخول باستخدام حساب Google":

    https://github.com/google/GoogleSignIn-iOS
    
  3. عند الانتهاء، سيبدأ Xcode تلقائيًا في حلّ التبعيات وتنزيلها في الخلفية.

تفعيل ميزة "تسجيل الدخول باستخدام حساب Google" لمشروعك على Firebase

للسماح للمستخدمين بتسجيل الدخول باستخدام ميزة "تسجيل الدخول باستخدام حساب Google"، عليك أولاً تفعيل موفّر خدمة Google Sign-In لمشروع Firebase:

  1. في وحدة تحكّم Firebase، انتقِل إلى الأمان > المصادقة.

  2. في علامة التبويب طريقة تسجيل الدخول، فعِّل موفّر Google.

  3. انقر على حفظ.

  4. نزِّل نسخة جديدة من ملف GoogleService-Info.plist الخاص بمشروعك وانسخها إلى مشروع Xcode. استبدِل أي إصدارات حالية بالإصدار الجديد. (راجِع مقالة إضافة Firebase إلى مشروع iOS).

استيراد ملفات العناوين المطلوبة

أولاً، عليك استيراد ملفات العناوين الخاصة بحزمة تطوير البرامج (SDK) لمنصة Firebase وحزمة تطوير البرامج (SDK) لخدمة "تسجيل الدخول باستخدام Google" إلى تطبيقك.

Swift

import FirebaseAuth
import GoogleSignIn

Objective-C

@import FirebaseCore;
@import GoogleSignIn;

تنفيذ عملية تسجيل الدخول باستخدام حساب Google

نفِّذ عملية تسجيل الدخول باستخدام حساب Google باتّباع الخطوات التالية. لمزيد من التفاصيل حول استخدام ميزة "تسجيل الدخول باستخدام حساب Google" على أجهزة iOS، يُرجى الاطّلاع على مستندات المطوّرين المتعلّقة بميزة "تسجيل الدخول باستخدام حساب Google".

  1. أضِف مخططات عناوين URL المخصّصة إلى مشروع Xcode باتّباع الخطوات التالية:
    1. افتح إعدادات مشروعك: انقر على اسم المشروع في عرض الشجرة على يمين الصفحة. اختَر تطبيقك من قسم الاستهدافات، ثم انقر على علامة التبويب المعلومات، ووسِّع قسم أنواع عناوين URL.
    2. انقر على الزر +، وأضِف مخطط URL لمعرّف العميل المعكوس. للعثور على هذه القيمة، افتح ملف الإعداد GoogleService-Info.plist وابحث عن المفتاح REVERSED_CLIENT_ID. انسخ قيمة هذا المفتاح، وألصِقها في مربّع مخططات عناوين URL في صفحة الإعدادات. اترك الحقول الأخرى بدون تغيير.

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

  2. في طريقة application:didFinishLaunchingWithOptions: لتفويض التطبيق، اضبط عنصر FirebaseApp.

    Swift

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
  3. نفِّذ طريقة application:openURL:options: في مفوّض تطبيقك. يجب أن تستدعي الطريقة طريقة handleURL الخاصة بكائن GIDSignIn، والتي ستتعامل بشكل صحيح مع عنوان URL الذي يتلقّاه تطبيقك في نهاية عملية المصادقة.

    Swift

    func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
      // ...
    }
      return GIDSignIn.sharedInstance.handle(url)
    }

    Objective-C

    - (BOOL)application:(nonnull UIApplication *)application
                openURL:(nonnull NSURL *)url
                options:(nonnull NSDictionary<NSString *, id> *)options {
      return [[GIDSignIn sharedInstance] handleURL:url];
    }
  4. مرِّر وحدة التحكّم في العرض التقديمي ومعرّف العميل لتطبيقك إلى طريقة signIn لموفّر خدمة &quot;تسجيل الدخول باستخدام حساب Google&quot;، وأنشئ بيانات اعتماد مصادقة Firebase من رمز مصادقة Google الناتج:

    Swift

    guard let clientID = FirebaseApp.app()?.options.clientID else { return }
    
    // Create Google Sign In configuration object.
    let config = GIDConfiguration(clientID: clientID)
    GIDSignIn.sharedInstance.configuration = config
    
    // Start the sign in flow!
    GIDSignIn.sharedInstance.signIn(withPresenting: viewController) { result, error in
      guard error == nil else {
        // ...
        return
      }
    
      guard let user = result?.user,
            let idToken = user.idToken?.tokenString
      else {
        // ...
        return
      }
    
      let credential = GoogleAuthProvider.credential(withIDToken: idToken,
                                                     accessToken: user.accessToken.tokenString)
      self.signIn(with: credential)
    }

    Objective-C

    GIDConfiguration *config = [[GIDConfiguration alloc] initWithClientID:[FIRApp defaultApp].options.clientID];
    [GIDSignIn.sharedInstance setConfiguration:config];
    
    __weak __auto_type weakSelf = self;
    [GIDSignIn.sharedInstance signInWithPresentingViewController:self
          completion:^(GIDSignInResult * _Nullable result, NSError * _Nullable error) {
      __auto_type strongSelf = weakSelf;
      if (strongSelf == nil) { return; }
    
      if (error == nil) {
        FIRAuthCredential *credential =
        [FIRGoogleAuthProvider credentialWithIDToken:result.user.idToken.tokenString
                                         accessToken:result.user.accessToken.tokenString];
        // ...
      } else {
        // ...
      }
    }];
  5. أضِف GIDSignInButton إلى مخطط القصة أو ملف XIB أو أنشئ مثيلاً له برمجيًا. لإضافة الزر إلى لوحة العرض أو ملف XIB، أضِف عرضًا واضبط فئته المخصّصة على GIDSignInButton.
  6. اختياري: إذا أردت تخصيص الزر، اتّبِع الخطوات التالية:

    Swift

    1. في وحدة التحكّم في العرض، عرِّف زر تسجيل الدخول كسمة.
      @IBOutlet weak var signInButton: GIDSignInButton!
    2. اربط الزرّ بالموقع signInButton الذي أضفته للتوّ.
    3. خصِّص الزر من خلال ضبط خصائص العنصر GIDSignInButton.

    Objective-C

    1. في ملف العنوان الخاص بوحدة التحكّم في العرض، عرِّف زر تسجيل الدخول كخاصية.
      @property(weak, nonatomic) IBOutlet GIDSignInButton *signInButton;
    2. اربط الزرّ بالموقع signInButton الذي أضفته للتوّ.
    3. خصِّص الزر من خلال ضبط خصائص العنصر GIDSignInButton.

المصادقة باستخدام Firebase

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

Swift

Auth.auth().signIn(with: credential) { result, error in
  guard error == nil else {
    // ...
    return
  }

  // At this point, our 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، ويمكن استخدامه لتحديد هوية المستخدم على مستوى كل تطبيق في مشروعك، بغض النظر عن طريقة تسجيل الدخول.

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

  • في Firebase Realtime Database و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;
}

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