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

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

قبل البدء

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

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

iOS: UIApplicationpublisher

في طريقة application:openURL:options في AppDelled، استدعِ طريقة 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: NSApplicationلوح

  1. في عنصر AppDegree لتطبيقك، سجِّل معالجًا لأحداث 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 واستدعِ handleURL GIDSignIn:

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، تعرَّف على كيفية: