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

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

قبل البدء

نزِّل التبعيات، واضبط مشروع Xcode، واضبط معرّف العميل.

يمكنك تجربة نموذج تطبيق على نظامَي التشغيل iOS وmacOS للتعرّف على آلية عمل ميزة "تسجيل الدخول".

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

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 واستدعاء GIDSignIn بـ handleURL:

Swift

@main
struct MyApp: App {

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

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

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

ويتم تنفيذ هذا الإجراء في تطبيقات iOS غالبًا بطريقة application:didFinishLaunchingWithOptions: لـ UIApplicationDelegate وapplicationDidFinishLaunching: في NSApplicationDelegate لتطبيقات 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

إذا كنت تستخدم 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. يمكنك تشغيل عملية تسجيل الدخول عند الضغط على الزر عن طريق إضافة طلب إلى طريقة signIn(presentingViewController:completion:) في GIDSignIn في الإجراء:

    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. وصِّل الزر بطريقة في 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. إضافة زر تسجيل الخروج

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

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

    Swift

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

    Objective-C

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

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

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