Z tej strony dowiesz się, jak zintegrować logowanie przez Google z aplikacją na iOS lub macOS. Może być konieczne dostosowanie tych instrukcji do cyklu życia aplikacji lub modelu interfejsu.
Zanim zaczniesz
Pobierz zależności, skonfiguruj projekt Xcode i ustaw identyfikator klienta.
Wypróbuj naszą przykładową aplikację na iOS i macOS, aby zobaczyć, jak działa logowanie.
1. Obsługa adresu URL przekierowania uwierzytelniania
Gdy użytkownik uwierzytelni się w Google, przepływ uwierzytelniania przekieruje go z powrotem do aplikacji z adresem URL zawierającym odpowiedź uwierzytelniania, w tym token identyfikatora użytkownika. Przekazanie tego adresu URL do GIDSignIn umożliwia pakietowi SDK przeanalizowanie odpowiedzi i zwrócenie danych logowania użytkownika do aplikacji.
iOS: UIApplicationDelegate
W metodzie application:openURL:options delegata aplikacji wywołaj metodę handleURL: klasy GIDSignIn:
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
W delegacie aplikacji zarejestruj moduł obsługi zdarzeń
kAEGetURLwapplicationDidFinishLaunching: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]; }Zdefiniuj moduł obsługi tych zdarzeń, który wywołuje metodę
handleURLklasyGIDSignIn: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
W oknie lub scenie aplikacji zarejestruj moduł obsługi, który będzie odbierać adres URL i wywoływać metodę handleURL klasy GIDSignIn:
Swift
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
// ...
.onOpenURL { url in
GIDSignIn.sharedInstance.handle(url)
}
}
}
}
2. Próba przywrócenia stanu logowania użytkownika
Gdy aplikacja się uruchamia, wywołaj metodę restorePreviousSignInWithCallback, aby spróbować przywrócić stan logowania użytkowników, którzy już zalogowali się za pomocą Google. Dzięki temu użytkownicy nie muszą logować się za każdym razem, gdy otwierają aplikację (chyba że się wylogowali).
Aplikacje na iOS często robią to w metodzie application:didFinishLaunchingWithOptions: klasy UIApplicationDelegate, a aplikacje na macOS w metodzie applicationDidFinishLaunching: klasy NSApplicationDelegate. Na podstawie wyniku określ, który widok ma się wyświetlić użytkownikowi. Na przykład:
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
Jeśli używasz SwiftUI, dodaj wywołanie metody restorePreviousSignIn w metodzie onAppear początkowego widoku:
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. Dodawanie przycisku logowania przez Google
Dodaj przycisk „Zaloguj się przez Google” do widoku logowania. Dostępne są komponenty dla SwiftUI i UIKit, które automatycznie generują przycisk zgodny z wytycznymi dotyczącymi marki Google.
Korzystanie z SwiftUI
Upewnij się, że do projektu dodano zależność przycisku „Zaloguj się przez Google” w SwiftUI.
W pliku, w którym chcesz dodać przycisk SwiftUI, dodaj wymagany import na początku pliku:
import GoogleSignInSwiftDodaj rozszerzenie
UIApplication, aby pobrać aktywny główny kontroler widoku na potrzeby prezentacji: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 } }Dodaj przycisk „Zaloguj się przez Google” do widoku i określ działanie, które zostanie wywołane po naciśnięciu przycisku:
GoogleSignInButton(action: handleSignInButton)Po naciśnięciu przycisku uruchom proces logowania, dodając wywołanie metody
signIn(withPresenting:completion:)klasyGIDSignInw działaniu: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. } }
Używa to domyślnego modelu widoku, który zawiera standardowe informacje o stylu przycisku. Aby kontrolować wygląd przycisku, musisz utworzyć niestandardowy
GoogleSignInButtonViewModel i ustawić go jako viewModel w inicjatorze przycisku
za pomocą GoogleSignInButton(viewModel: yourViewModel, action:
yourAction). Więcej informacji znajdziesz w
GoogleSignInButtonViewModel kodzie źródłowym.
Korzystanie z UIKit
Dodaj przycisk „Zaloguj się przez Google” do widoku logowania. Możesz użyć klasy
GIDSignInButton, aby automatycznie wygenerować przycisk z brandingiem Google (zalecane), lub utworzyć własny przycisk z niestandardowym stylem.Aby dodać
GIDSignInButtondo pliku storyboard lub XIB, dodaj widok i ustaw jego niestandardową klasę naGIDSignInButton. Pamiętaj, że gdy dodasz widokGIDSignInButtondo storyboard, przycisk logowania nie będzie renderowany w kreatorze interfejsu. Uruchom aplikację, aby zobaczyć przycisk logowania.Wygląd
GIDSignInButtonmożesz dostosować, ustawiając jego właściwościcolorSchemeistyle:Właściwości stylu GIDSignInButton colorSchemekGIDSignInButtonColorSchemeLight
kGIDSignInButtonColorSchemeDarkstylekGIDSignInButtonStyleStandard
kGIDSignInButtonStyleWide
kGIDSignInButtonStyleIconOnlyPołącz przycisk z metodą w ViewController, która wywołuje metodę
signIn:. Na przykład użyjIBAction: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. Dodawanie przycisku wylogowania
Dodaj do aplikacji przycisk wylogowania widoczny dla zalogowanych użytkowników, który wywołuje metodę signOut klasy GIDSignIn.
Wywołanie metody signOut czyści stan logowania przechowywany w GIDSignIn i usuwa dane logowania użytkownika do aplikacji z pęku kluczy. Aplikacja jest odpowiedzialna za aktualizowanie własnego stanu i interfejsu. Wylogowanie dotyczy tylko Twojej aplikacji. Nie powoduje wylogowania użytkownika z innych aplikacji ani usług i nie cofa uprawnień przyznanych aplikacji przez użytkownika.
Korzystanie z SwiftUI
W SwiftUI dodaj Button, który wywołuje metodę GIDSignIn.sharedInstance.signOut():
Button("Sign Out") {
GIDSignIn.sharedInstance.signOut()
// Calling signOut() may not automatically trigger UI updates.
// Update your app's state as needed.
}
Korzystanie z UIKit
Połącz przycisk z metodą w ViewController, która wywołuje metodę signOut:. Na przykład użyj IBAction:
Swift
@IBAction func signOut(sender: Any) {
GIDSignIn.sharedInstance.signOut()
}
Objective-C
- (IBAction)signOut:(id)sender {
[GIDSignIn.sharedInstance signOut];
}
Dalsze kroki
Teraz, gdy użytkownicy mogą logować się w Twojej aplikacji za pomocą kont Google, dowiedz się, jak:
- pobierać informacje profilowe z kont Google użytkowników;
- uwierzytelniać się w backendzie za pomocą tokena identyfikatora Google użytkownika.
- wywoływać interfejsy API Google w imieniu użytkownika.