دمج تسجيل الدخول بحساب Google في تطبيق iOS أو macOS

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

قبل البدء

تنزيل العناصر التابعة وإعداد مشروع Xcode وتحديد معرّف العميل

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

1. التعامل مع عنوان URL لإعادة التوجيه الخاص بالمصادقة

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

‫iOS: UIApplicationDelegate

في طريقة application:openURL:options الخاصة بـ AppDelegate، استدعِ طريقة handleURL: الخاصة بـ GIDSignIn:

Swift

func application(
  _ app: UIApplication,
  open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]
) -> Bool {
  var handled: Bool

  handled = GIDSignIn.sharedInstance.handle(url)
  if handled {
    return true
  }

  // Handle other custom URL types.

  // If not handled by this app, return false.
  return false
}

Objective-C

- (BOOL)application:(UIApplication *)app
            openURL:(NSURL *)url
            options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
  BOOL handled;

  handled = [GIDSignIn.sharedInstance handleURL:url];
  if (handled) {
    return YES;
  }

  // Handle other custom URL types.

  // If not handled by this app, return NO.
  return NO;
}

‫macOS: NSApplicationDelegate

  1. في AppDelegate الخاص بتطبيقك، سجِّل معالجًا لأحداث kAEGetURL في applicationDidFinishLaunching:

    Swift

    func applicationDidFinishLaunching(_ notification: Notification) {
      // Register for GetURL events.
      let appleEventManager = NSAppleEventManager.shared()
      appleEventManager.setEventHandler(
        self,
        andSelector: "handleGetURLEvent:replyEvent:",
        forEventClass: AEEventClass(kInternetEventClass),
        andEventID: AEEventID(kAEGetURL)
      )
    }
    

    Objective-C

    - (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
      // Register for GetURL events.
      NSAppleEventManager *appleEventManager = [NSAppleEventManager sharedAppleEventManager];
      [appleEventManager setEventHandler:self
                         andSelector:@selector(handleGetURLEvent:withReplyEvent:)
                         forEventClass:kInternetEventClass
                         andEventID:kAEGetURL];
    }
    
  2. حدِّد معالجًا لهذه الأحداث يستدعي handleURL في GIDSignIn:

    Swift

    func handleGetURLEvent(event: NSAppleEventDescriptor?, replyEvent: NSAppleEventDescriptor?) {
        if let urlString =
          event?.paramDescriptor(forKeyword: AEKeyword(keyDirectObject))?.stringValue{
            let url = NSURL(string: urlString)
            GIDSignIn.sharedInstance.handle(url)
        }
    }
    

    Objective-C

    - (void)handleGetURLEvent:(NSAppleEventDescriptor *)event
               withReplyEvent:(NSAppleEventDescriptor *)replyEvent {
          NSString *URLString = [[event paramDescriptorForKeyword:keyDirectObject] stringValue];
          NSURL *URL = [NSURL URLWithString:URLString];
          [GIDSignIn.sharedInstance handleURL:url];
    }
    

SwiftUI

في نافذة تطبيقك أو مشهده، سجِّل معالجًا لتلقّي عنوان URL واستدعاء GIDSignIns handleURL:

Swift

@main
struct MyApp: App {

  var body: some Scene {
    WindowGroup {
      ContentView()
        // ...
        .onOpenURL { url in
          GIDSignIn.sharedInstance.handle(url)
        }
    }
  }
}

2. محاولة استعادة حالة تسجيل الدخول للمستخدم

عند بدء تشغيل تطبيقك، استدعِ الدالة restorePreviousSignInWithCallback لمحاولة استعادة حالة تسجيل الدخول للمستخدمين الذين سجّلوا الدخول باستخدام Google من قبل. ويضمن ذلك ألا يضطر المستخدمون إلى تسجيل الدخول في كل مرة يفتحون فيها تطبيقك (إلا إذا سجّلوا الخروج).

تنفّذ تطبيقات iOS هذه العملية غالبًا في طريقة UIApplicationDelegate's application:didFinishLaunchingWithOptions:، بينما تنفّذها تطبيقات macOS في NSApplicationDelegate's applicationDidFinishLaunching:. استخدِم النتيجة لتحديد طريقة العرض التي ستظهر للمستخدم. على سبيل المثال:

Swift

func application(
  _ application: UIApplication,
  didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
  GIDSignIn.sharedInstance.restorePreviousSignIn { user, error in
    if error != nil || user == nil {
      // Show the app's signed-out state.
    } else {
      // Show the app's signed-in state.
    }
  }
  return true
}

Objective-C

- (BOOL)application:(UIApplication *)application
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  [GIDSignIn.sharedInstance restorePreviousSignInWithCompletion:^(GIDGoogleUser * _Nullable user,
                                                                  NSError * _Nullable error) {
    if (error) {
      // Show the app's signed-out state.
    } else {
      // Show the app's signed-in state.
    }
  }];
  return YES;
}

SwiftUI

إذا كنت تستخدم SwiftUI، أضِف طلبًا إلى restorePreviousSignIn في onAppear للعرض الأوّلي:

Swift

@main
struct MyApp: App {
  var body: some Scene {
    WindowGroup {
      ContentView()
        // ...
        .onAppear {
          GIDSignIn.sharedInstance.restorePreviousSignIn { user, error in
            // Check if `user` exists; otherwise, do something with `error`
          }
        }
    }
  }
}

3- إضافة زر "تسجيل الدخول باستخدام حساب Google"

أضِف زر "تسجيل الدخول باستخدام حساب Google" إلى طريقة عرض تسجيل الدخول. تتوفّر مكوّنات لكلّ من SwiftUI وUIKit تنشئ تلقائيًا زرًا يلتزم إرشادات بناء هوية العلامة التجارية من Google.

استخدام SwiftUI

  1. تأكَّد من أنّك أضفت الاعتمادية الخاصة بزر "تسجيل الدخول باستخدام حساب Google" في SwiftUI إلى مشروعك.

  2. في الملف الذي تريد إضافة زر SwiftUI إليه، أضِف عملية الاستيراد المطلوبة إلى أعلى الملف:

    import GoogleSignInSwift
    
  3. أضِف إضافة UIApplication لاسترداد وحدة التحكّم النشطة في العرض الجذر للعرض:

    extension UIApplication {
      // Minimal implementation to retrieve the active root view
      // controller for presentation. Apps presenting sign-in from deeper
      // within an existing view hierarchy should ensure they select the
      // appropriate view controller.
      var rootViewController: UIViewController? {
        let windowScene = connectedScenes
          .compactMap { scene in scene as? UIWindowScene }
          .first { scene in scene.activationState == .foregroundActive }
        return windowScene?.windows.first(where: { window in window.isKeyWindow })?.rootViewController
      }
    }
    
  4. أضِف زر "تسجيل الدخول باستخدام حساب Google" إلى طريقة العرض وحدِّد الإجراء الذي سيتم تنفيذه عند الضغط على الزر:

    GoogleSignInButton(action: handleSignInButton)
    
  5. ابدأ عملية تسجيل الدخول عند الضغط على الزر من خلال إضافة استدعاء إلى طريقة GIDSignIn في signIn(withPresenting:completion:) في الإجراء الخاص بك:

    func handleSignInButton() {
      guard let rootViewController = UIApplication.shared.rootViewController else {
        // Handle error
        return
      }
    
      GIDSignIn.sharedInstance.signIn(withPresenting: rootViewController) { signInResult, error in
        guard let result = signInResult else {
          // Inspect error
          return
        }
        // If sign in succeeded, display the app's main content view.
      }
    }
    

يستخدم هذا الإجراء نموذج العرض التلقائي الذي يوفّر معلومات التنسيق العادي للزر. للتحكّم في مظهر الزر، عليك إنشاء GoogleSignInButtonViewModel مخصّص وتعيينه كـ viewModel في أداة تهيئة الزر باستخدام GoogleSignInButton(viewModel: yourViewModel, action: yourAction). يمكنك الاطّلاع على GoogleSignInButtonViewModelرمز المصدر للحصول على مزيد من المعلومات.

استخدام UIKit

  1. أضِف زر "تسجيل الدخول باستخدام حساب Google" إلى طريقة عرض تسجيل الدخول. يمكنك استخدام الفئة GIDSignInButton لإنشاء زر تلقائيًا يتضمّن العلامة التجارية من Google (ننصح بذلك) أو إنشاء زر خاص بك باستخدام أنماط مخصّصة.

    لإضافة GIDSignInButton إلى لوحة عرض أو ملف XIB، أضِف View واضبط فئته المخصّصة على GIDSignInButton. يُرجى العِلم أنّه عند إضافة GIDSignInButton عرض إلى لوحة العرض، لن يتم عرض زر تسجيل الدخول في &quot;أداة إنشاء واجهات المستخدم&quot;. شغِّل التطبيق للاطّلاع على زر تسجيل الدخول.

    يمكنك تخصيص مظهر GIDSignInButton من خلال ضبط خصائص colorScheme وstyle:

    خصائص نمط GIDSignInButton
    colorScheme kGIDSignInButtonColorSchemeLight
    kGIDSignInButtonColorSchemeDark
    style kGIDSignInButtonStyleStandard
    kGIDSignInButtonStyleWide
    kGIDSignInButtonStyleIconOnly
  2. اربط الزر بطريقة في ViewController تستدعي signIn:. على سبيل المثال، استخدِم IBAction:

    Swift

    @IBAction func signIn(sender: Any) {
      GIDSignIn.sharedInstance.signIn(withPresenting: self) { signInResult, error in
        guard error == nil else { return }
    
        // If sign in succeeded, display the app's main content View.
      }
    }
    

    Objective-C

    - (IBAction)signIn:(id)sender {
      [GIDSignIn.sharedInstance
          signInWithPresentingViewController:self
                                  completion:^(GIDSignInResult * _Nullable signInResult,
                                               NSError * _Nullable error) {
        if (error) {
          return;
        }
    
        // If sign in succeeded, display the app's main content View.
      }];
    }
    

4. إضافة زر تسجيل الخروج

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

يؤدي استدعاء signOut إلى محو حالة تسجيل الدخول المخزَّنة في GIDSignIn وإزالة بيانات اعتماد المستخدم لتطبيقك من Keychain. ويتحمّل تطبيقك مسؤولية تعديل حالته وواجهة المستخدم الخاصة به. لا ينطبق تسجيل الخروج إلا على تطبيقك، ولا يؤدي إلى تسجيل خروج المستخدم من التطبيقات أو الخدمات الأخرى، كما أنّه لا يؤدي إلى إبطال الأذونات التي منحها المستخدم لتطبيقك.

استخدام SwiftUI

في SwiftUI، أضِف Button التي تستدعي GIDSignIn.sharedInstance.signOut():

Button("Sign Out") {
  GIDSignIn.sharedInstance.signOut()
  // Calling signOut() may not automatically trigger UI updates.
  // Update your app's state as needed.
}

استخدام UIKit

اربط الزر بطريقة في ViewController تستدعي signOut:. على سبيل المثال، استخدِم IBAction:

Swift

@IBAction func signOut(sender: Any) {
  GIDSignIn.sharedInstance.signOut()
}

Objective-C

- (IBAction)signOut:(id)sender {
  [GIDSignIn.sharedInstance signOut];
}

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

بعد أن أصبح بإمكان المستخدمين تسجيل الدخول إلى تطبيقك باستخدام حساباتهم على Google، تعرَّف على كيفية تنفيذ ما يلي: