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

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

قبل البدء

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

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

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. سجِّل المعالِج الخاص بأحداث kAEGetURL في تطبيقك ضمن AppDelegate 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. توصيل الزر بطريقة في 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، يمكنك التعرّف على كيفية إلى: