На этой странице показано, как интегрировать вход через Google в приложение для iOS или macOS. Возможно, вам потребуется адаптировать эти инструкции под жизненный цикл вашего приложения или модель пользовательского интерфейса.
Прежде чем начать
Загрузите зависимости, настройте свой проект Xcode и укажите свой идентификатор клиента .
1. Обработка URL-адреса перенаправления аутентификации.
После аутентификации пользователя в Google процесс аутентификации перенаправляет обратно в ваше приложение с URL-адресом, содержащим ответ на запрос аутентификации, включая токен идентификации пользователя. Передача этого URL-адреса в GIDSignIn позволяет SDK проанализировать ответ и вернуть учетные данные пользователя в ваше приложение.
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
В классе 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]; }Определите обработчик для этих событий, который вызывает
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
Убедитесь, что вы добавили зависимость для кнопки SwiftUI "Войти через Google" в свой проект.
В файле, куда вы хотите добавить кнопку SwiftUI, добавьте необходимый импорт в начало файла:
import GoogleSignInSwiftДобавьте расширение
UIApplicationдля получения активного корневого контроллера представления для отображения:extension UIApplication { // Minimal implementation to retrieve the active root view // controller for presentation. Apps presenting sign-in from deeper // within an existing view hierarchy should ensure they select the // appropriate view controller. var rootViewController: UIViewController? { let windowScene = connectedScenes .compactMap { scene in scene as? UIWindowScene } .first { scene in scene.activationState == .foregroundActive } return windowScene?.windows.first(where: { window in window.isKeyWindow })?.rootViewController } }Добавьте в ваше представление кнопку «Войти через Google» и укажите действие, которое будет вызвано при нажатии этой кнопки:
GoogleSignInButton(action: handleSignInButton)Чтобы запустить процесс авторизации при нажатии кнопки, добавьте вызов метода
signIn(withPresenting:completion:)классаGIDSignInв ваше действие:func handleSignInButton() { guard let rootViewController = UIApplication.shared.rootViewController else { // Handle error return } 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
Добавьте кнопку «Войти через Google» в окно входа. Вы можете использовать класс
GIDSignInButtonдля автоматической генерации кнопки с фирменной символикой Google (рекомендуется) или создать собственную кнопку с пользовательским стилем.Чтобы добавить
GIDSignInButtonв раскадровку или XIB-файл, добавьте View и установите для его пользовательского класса значениеGIDSignInButton. Обратите внимание, что при добавлении ViewGIDSignInButtonв раскадровку кнопка входа в систему не отображается в Interface Builder. Запустите приложение, чтобы увидеть кнопку входа в систему.Вы можете настроить внешний вид
GIDSignInButton, задав ее свойстваcolorSchemeиstyle:Свойства стиля кнопки GIDSignInButton colorSchemekGIDSignInButtonColorSchemeLight
kGIDSignInButtonColorSchemeDarkstylekGIDSignInButtonStyleStandard
kGIDSignInButtonStyleWide
kGIDSignInButtonStyleIconOnlyПривяжите кнопку к методу в вашем 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. Добавьте кнопку выхода из системы.
Добавьте в приложение кнопку выхода, видимую для авторизованных пользователей, которая вызывает метод signOut класса GIDSignIn .
Вызов signOut очищает состояние входа, хранящееся в GIDSignIn , и удаляет учетные данные пользователя для вашего приложения из связки ключей. Ваше приложение отвечает за обновление собственного состояния и пользовательского интерфейса. Выход из системы применяется только к вашему приложению. Он не выходит из других приложений или служб и не отзывает разрешения, предоставленные пользователем вашему приложению.
Использование SwiftUI
В SwiftUI добавьте Button , которая вызывает метод GIDSignIn.sharedInstance.signOut() :
Button("Sign Out") {
GIDSignIn.sharedInstance.signOut()
// Calling signOut() may not automatically trigger UI updates.
// Update your app's state as needed.
}
Использование UIKit
Привяжите кнопку к методу в вашем ViewController, который вызывает signOut: . Например, используйте IBAction :
Быстрый
@IBAction func signOut(sender: Any) {
GIDSignIn.sharedInstance.signOut()
}
Objective-C
- (IBAction)signOut:(id)sender {
[GIDSignIn.sharedInstance signOut];
}
Следующие шаги
Теперь, когда пользователи могут входить в ваше приложение, используя свои учетные записи Google, узнайте, как это сделать:
- Получите информацию из профиля учетной записи Google пользователей .
- Аутентификация на вашем бэкэнде осуществляется с помощью токена Google ID пользователя.
- Вызывайте API Google от имени пользователя.