本页介绍了如何将 Google 登录功能集成到 iOS 或 macOS 应用中。 您可能需要针对应用的生命周期或界面模型调整这些说明。
准备工作
下载依赖项,配置您的 Xcode 项目,并设置您的客户端 ID。
试用我们的 iOS 和 macOS 示例应用,了解“登录”功能的运作方式。
1. 处理身份验证重定向网址
iOS:UIApplicationDelegate
在 AppDelegate 的 application:openURL:options
方法中,调用 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
在应用的 AppDelegate 中,为
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]; }
为调用
GIDSignIn
的handleURL
的这些事件定义处理程序: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
在应用的窗口或场景中,注册一个处理程序来接收网址并调用
GIDSignIn
handleURL
:
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
如果您使用的是 SwiftUI,请在 onAppear
中添加对 restorePreviousSignIn
的调用,以便
您的初始视图:
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
确保您已添加 SwiftUI“使用 Google 账号登录”选项的依赖项按钮 添加到您的项目中。
在要添加 SwiftUI 按钮的文件中,将所需的 import 添加到文件顶部:
import GoogleSignInSwift
添加“使用 Google 账号登录”按钮添加到视图,并指定操作 按钮:
GoogleSignInButton(action: handleSignInButton)
在用户按下按钮时触发登录流程,具体方法是:
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
添加“使用 Google 账号登录”按钮添加到登录视图。您可以使用
GIDSignInButton
类,通过 Google 自动生成按钮 品牌(推荐)或创建自己的带有自定义样式的按钮。如需将
GIDSignInButton
添加到 Storyboard 或 XIB 文件中,请添加一个 View 并将 将其自定义类设为GIDSignInButton
。请注意,将GIDSignInButton
查看您的故事板,登录按钮未呈现 。运行应用以查看登录按钮。您可以通过设置
GIDSignInButton
的colorScheme
和style
属性:GIDSignInButton 样式属性 colorScheme
kGIDSignInButtonColorSchemeLight
kGIDSignInButtonColorSchemeDark
style
kGIDSignInButtonStyleStandard
kGIDSignInButtonStyleWide
kGIDSignInButtonStyleIconOnly
将按钮连接到 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. 添加退出按钮
为您的应用添加一个对已登录用户可见的退出按钮。
将按钮连接到 ViewController 中调用
signOut:
。例如,使用IBAction
:Swift
@IBAction func signOut(sender: Any) { GIDSignIn.sharedInstance.signOut() }
Objective-C
- (IBAction)signOut:(id)sender { [GIDSignIn.sharedInstance signOut]; }
后续步骤
现在,用户可以使用他们的 Google 账号登录您的应用了,不妨了解一下 更改为:
- 获取用户的Google 账号个人资料信息。
- 使用用户的 Google ID 通过后端进行身份验证 令牌。
- 代表用户调用 Google API。