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

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

قبل البدء

تنزيل التبعيات وتهيئة مشروع Xcode وتعيين معرِّف العميل.

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

iOS: UIApplicationDelegate

في طريقة application:openURL:options على AppDelegate، عليك استدعاء طريقة GIDSignIn handleURL::

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. في Appتفويض تطبيقك، سجِّل معالجًا لأحداث 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];
    }
    

سويفت

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

Swift

@main
struct MyApp: App {

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

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

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

وتُجري تطبيقات iOS ذلك غالبًا بطريقة UIApplicationDelegate application:didFinishLaunchingWithOptions: وNSApplicationDelegate applicationDidFinishLaunching: لتطبيقات macOS. استخدم النتيجة لتحديد الملف الشخصي الذي سيتم عرضه للمستخدم. مثلاً:

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، فأضف مكالمة إلى 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. أضف زر "تسجيل الدخول باستخدام حساب Google" إلى طريقة العرض، وحدد الإجراء الذي سيتم استدعاؤه عند الضغط على الزر:

    GoogleSignInButton(action: handleSignInButton)
    
  4. يمكنك تشغيل عملية تسجيل الدخول عند الضغط على الزر من خلال إضافة استدعاء إلى أسلوب GIDSignIn signIn(presentingViewController:completion:) في الإجراء الذي تتخذه:

    func handleSignInButton() {
      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، يمكنك إضافة ملف شخصي وضبط الفئة المخصّصة له على GIDSignInButton. تجدر الإشارة إلى أنه عند إضافة عرض GIDSignInButton إلى لوحة العمل، لا يظهر زر تسجيل الدخول في أداة إنشاء الواجهة. شغِّل التطبيق لرؤية زر تسجيل الدخول.

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

    خصائص نمط GIDSignInButton
    colorScheme kGIDSignInButtonColorSchemeLight
    kGIDSignInButtonColorSchemeDark
    style kGIDSignInButtonStyleStandard
    kGIDSignInButtonStyleWide
    kGIDSignInButtonStyleIconOnly
  2. اربط الزر بطريقة في وحدة تحكّم المشاهدة تستدعي 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. إضافة زر تسجيل الخروج

  1. أضف زرًا للخروج إلى تطبيقك، مرئيًا للمستخدمين الذين سجّلوا الدخول.

  2. اربط الزر بطريقة في وحدة تحكّم المشاهدة تستدعي signOut:. على سبيل المثال، يمكنك استخدام IBAction:

    Swift

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

    Objective-C

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

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

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