Интеграция входа в Google в ваше приложение iOS или macOS

На этой странице показано, как интегрировать вход через Google в приложение для iOS или macOS. Возможно, вам потребуется адаптировать эти инструкции под жизненный цикл вашего приложения или модель пользовательского интерфейса.

Прежде чем начать

Загрузите зависимости, настройте свой проект Xcode и укажите свой идентификатор клиента .

Попробуйте наше демонстрационное приложение для iOS и macOS, чтобы увидеть, как работает вход в систему .

1. Обработка 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
}

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 :

    Быстрый

    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 :

    Быстрый

    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 :

Быстрый

@main
struct MyApp: App {

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

2. Попытаться восстановить состояние авторизации пользователя.

При запуске приложения вызовите метод restorePreviousSignInWithCallback , чтобы попытаться восстановить состояние авторизации пользователей, которые уже вошли в систему через Google. Это гарантирует, что пользователям не придется входить в систему каждый раз при открытии приложения (если только они не вышли из системы).

В iOS-приложениях это часто делается в application:didFinishLaunchingWithOptions: класса UIApplicationDelegate , а в macOS applicationDidFinishLaunching: класса NSApplicationDelegate . Используйте результат, чтобы определить, какое представление отобразить пользователю. Например:

Быстрый

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 для вашего начального представления:

Быстрый

@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. Убедитесь, что вы добавили зависимость для кнопки SwiftUI "Войти через Google" в свой проект.

  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-файл, добавьте View и установите для его пользовательского класса значение GIDSignInButton . Обратите внимание, что при добавлении View GIDSignInButton в раскадровку кнопка входа в систему не отображается в Interface Builder. Запустите приложение, чтобы увидеть кнопку входа в систему.

    Вы можете настроить внешний вид 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.
      }
    }
    

    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 :

    Быстрый

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

    Objective-C

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

Следующие шаги

Теперь, когда пользователи могут входить в ваше приложение, используя свои учетные записи Google, узнайте, как это сделать: