ادغام Google Sign-In در برنامه iOS یا macOS شما

این صفحه به شما نشان می‌دهد که چگونه ورود به سیستم گوگل را در یک برنامه iOS یا macOS ادغام کنید. ممکن است لازم باشد این دستورالعمل‌ها را با چرخه عمر برنامه یا مدل رابط کاربری خود تطبیق دهید.

قبل از اینکه شروع کنی

وابستگی‌ها را دانلود کنید، پروژه Xcode خود را پیکربندی کنید و شناسه کلاینت خود را تنظیم کنید .

برای مشاهده نحوه عملکرد ورود به سیستم، برنامه نمونه iOS و macOS ما را امتحان کنید .

۱. مدیریت URL تغییر مسیر احراز هویت

iOS: نماینده برنامه UIApplicationDelegate

در application:openURL:options از AppDelegate، متد handleURL: از GIDSignIn را فراخوانی کنید:

سویفت

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
}

هدف-سی

- (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 ثبت کنید:

    سویفت

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

    هدف-سی

    - (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 را فراخوانی کند:

    سویفت

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

    هدف-سی

    - (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 را فراخوانی کنید:

سویفت

@main
struct MyApp: App {

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

۲. تلاش برای بازیابی وضعیت ورود کاربر

وقتی برنامه شما شروع به کار می‌کند، تابع restorePreviousSignInWithCallback را فراخوانی کنید تا وضعیت ورود کاربرانی که قبلاً با استفاده از گوگل وارد سیستم شده‌اند را بازیابی کنید. انجام این کار تضمین می‌کند که کاربران هر بار که برنامه شما را باز می‌کنند، مجبور به ورود به سیستم نباشند (مگر اینکه از سیستم خارج شده باشند).

برنامه‌های iOS اغلب این کار را در application:didFinishLaunchingWithOptions: از کلاس UIApplicationDelegate و در برنامه‌های macOS در applicationDidFinishLaunching: از کلاس NSApplicationDelegate انجام می‌دهند. از نتیجه برای تعیین اینکه کدام view را به کاربر ارائه دهد استفاده کنید. برای مثال:

سویفت

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
}

هدف-سی

- (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 in onAppear را اضافه کنید:

سویفت

@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`
          }
        }
    }
  }
}

۳. دکمه ورود به سیستم گوگل را اضافه کنید

یک دکمه «ورود با گوگل» به نمای ورود خود اضافه کنید. کامپوننت‌هایی برای SwiftUI و UIKit در دسترس هستند که به طور خودکار دکمه‌ای با برند گوگل ایجاد می‌کنند و استفاده از آنها توصیه می‌شود.

استفاده از SwiftUI

  1. مطمئن شوید که وابستگی مربوط به دکمه «ورود با گوگل» در SwiftUI را به پروژه خود اضافه کرده‌اید.

  2. در فایلی که می‌خواهید دکمه SwiftUI را به آن اضافه کنید، دستور import مورد نیاز را به بالای فایل اضافه کنید:

    import GoogleSignInSwift
    
  3. یک دکمه‌ی «ورود با گوگل» به View خود اضافه کنید و عملی را که هنگام فشردن دکمه فراخوانی می‌شود، مشخص کنید:

    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. یک دکمه "ورود با گوگل" به نمای ورود خود اضافه کنید. می‌توانید از کلاس GIDSignInButton برای تولید خودکار دکمه‌ای با برند گوگل (توصیه می‌شود) استفاده کنید یا دکمه خودتان را با استایل سفارشی ایجاد کنید.

    برای افزودن یک GIDSignInButton به یک استوری‌بورد یا فایل XIB، یک View اضافه کنید و کلاس سفارشی آن را روی GIDSignInButton تنظیم کنید. توجه داشته باشید که وقتی یک View از نوع GIDSignInButton را به استوری‌بورد خود اضافه می‌کنید، دکمه ورود در سازنده رابط نمایش داده نمی‌شود. برنامه را اجرا کنید تا دکمه ورود را ببینید.

    شما می‌توانید ظاهر یک GIDSignInButton را با تنظیم ویژگی‌های colorScheme و style آن سفارشی کنید:

    ویژگی‌های استایل دکمه‌ی GIDSignInButton
    colorScheme kGIDSignInButtonColorSchemeLight
    kGIDSignInButtonColorSchemeDark
    style kGIDSignInButtonStyleStandard
    kGIDSignInButtonStyleWide
    kGIDSignInButtonStyleIconOnly
  2. دکمه را به متدی در ViewController خود که signIn: فراخوانی می‌کند، متصل کنید. برای مثال، از یک IBAction استفاده کنید:

    سویفت

    @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.
      }
    }
    

    هدف-سی

    - (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.
      }];
    }
    

۴. دکمه خروج را اضافه کنید

  1. یک دکمه خروج به برنامه خود اضافه کنید که برای کاربران وارد شده قابل مشاهده باشد.

  2. دکمه را به متدی در ViewController خود که signOut: متصل کنید. برای مثال، از یک IBAction استفاده کنید:

    سویفت

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

    هدف-سی

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

مراحل بعدی

اکنون که کاربران می‌توانند با استفاده از حساب‌های گوگل خود وارد برنامه شما شوند، یاد بگیرید چگونه: