Google Log-in in die iOS- oder macOS-App einbinden

Auf dieser Seite wird beschrieben, wie Sie Google Log-in in eine iOS- oder macOS-App einbinden. Möglicherweise müssen Sie diese Anleitung an den Lebenszyklus oder das UI-Modell Ihrer App anpassen.

Hinweis

Laden Sie die Abhängigkeiten herunter, konfigurieren Sie Ihr Xcode-Projekt und legen Sie Ihre Client-ID fest.

In unserer iOS- und macOS-Beispiel-App können Sie sehen, wie Google Log-in funktioniert.

1. Authentifizierungs-Weiterleitungs-URL verarbeiten

Nachdem sich ein Nutzer mit Google authentifiziert hat, wird er über den Authentifizierungsablauf mit einer URL, die die Authentifizierungsantwort enthält, einschließlich des ID-Tokens des Nutzers, zu Ihrer App weitergeleitet. Wenn Sie diese URL an GIDSignIn übergeben, kann das SDK die Antwort parsen und die Anmeldedaten des Nutzers an Ihre App zurückgeben.

iOS: UIApplicationDelegate

Rufen Sie in der Methode application:openURL:options Ihres AppDelegate die Methode handleURL: von GIDSignIn auf:

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

  1. Registrieren Sie in der Methode applicationDidFinishLaunching Ihres AppDelegate einen Handler für kAEGetURL-Ereignisse:

    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];
    }
    
  2. Definieren Sie den Handler für diese Ereignisse, der handleURL von GIDSignIn aufruft:

    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

Registrieren Sie im Fenster oder in der Szene Ihrer App einen Handler, um die URL zu empfangen, und rufen Sie handleURL von GIDSignIn auf:

Swift

@main
struct MyApp: App {

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

2. Anmeldezustand des Nutzers wiederherstellen

Rufen Sie beim Starten Ihrer App restorePreviousSignInWithCallback auf, um den Anmeldezustand von Nutzern wiederherzustellen, die sich bereits mit Google angemeldet haben. So müssen sich Nutzer nicht jedes Mal anmelden, wenn sie Ihre App öffnen (es sei denn, sie haben sich abgemeldet).

iOS-Apps tun dies häufig in der Methode application:didFinishLaunchingWithOptions: von UIApplicationDelegate und macOS-Apps in der Methode applicationDidFinishLaunching: von NSApplicationDelegate. Anhand des Ergebnisses können Sie bestimmen, welche Ansicht dem Nutzer präsentiert werden soll. Beispiel:

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

Wenn Sie SwiftUI verwenden, fügen Sie für Ihre erste Ansicht in onAppear einen Aufruf von restorePreviousSignIn hinzu:

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 Log-in-Schaltfläche hinzufügen

Fügen Sie Ihrer Anmeldeansicht eine Schaltfläche „Über Google anmelden“ hinzu. Für SwiftUI und UIKit sind Komponenten verfügbar, die automatisch eine Schaltfläche gemäß den Google-Branding-Richtlinien generieren.

SwiftUI verwenden

  1. Achten Sie darauf, dass Sie Ihrem Projekt die Abhängigkeit für die SwiftUI-Schaltfläche „Über Google anmelden“ hinzugefügt haben.

  2. Fügen Sie in der Datei, in der Sie die SwiftUI-Schaltfläche hinzufügen möchten, oben in der Datei den erforderlichen Import hinzu:

    import GoogleSignInSwift
    
  3. Fügen Sie eine UIApplication-Erweiterung hinzu, um den aktiven Root-View-Controller für die Präsentation abzurufen:

    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
      }
    }
    
  4. Fügen Sie Ihrer Ansicht eine Schaltfläche „Über Google anmelden“ hinzu und geben Sie die Aktion an, die aufgerufen wird, wenn die Schaltfläche gedrückt wird:

    GoogleSignInButton(action: handleSignInButton)
    
  5. Lösen Sie den Anmeldevorgang aus, wenn die Schaltfläche gedrückt wird, indem Sie in Ihrer Aktion einen Aufruf der Methode signIn(withPresenting:completion:) von GIDSignIn hinzufügen:

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

Dabei wird das Standard-View-Modell verwendet, das Standard-Stilinformationen für die Schaltfläche enthält. Wenn Sie die Darstellung der Schaltfläche steuern möchten, müssen Sie ein benutzerdefiniertes GoogleSignInButtonViewModel erstellen und es als viewModel im Initialisierer der Schaltfläche mit GoogleSignInButton(viewModel: yourViewModel, action: yourAction) festlegen. Weitere Informationen finden Sie im GoogleSignInButtonViewModel Quellcode.

UIKit verwenden

  1. Fügen Sie Ihrer Anmeldeansicht eine Schaltfläche „Über Google anmelden“ hinzu. Sie können die Klasse GIDSignInButton verwenden, um automatisch eine Schaltfläche mit Google-Branding zu generieren (empfohlen), oder eine eigene Schaltfläche mit benutzerdefiniertem Stil erstellen.

    Wenn Sie einer Storyboard- oder XIB-Datei ein GIDSignInButton hinzufügen möchten, fügen Sie eine Ansicht hinzu und legen Sie die benutzerdefinierte Klasse auf GIDSignInButton fest. Wenn Sie Ihrer Storyboard-Datei eine GIDSignInButton-Ansicht hinzufügen, wird die Anmeldeschaltfläche nicht im Interface Builder gerendert. Führen Sie die App aus, um die Anmeldeschaltfläche zu sehen.

    Sie können die Darstellung eines GIDSignInButton anpassen, indem Sie die Attribute colorScheme und style festlegen:

    Stilattribute von GIDSignInButton
    colorScheme kGIDSignInButtonColorSchemeLight
    kGIDSignInButtonColorSchemeDark
    style kGIDSignInButtonStyleStandard
    kGIDSignInButtonStyleWide
    kGIDSignInButtonStyleIconOnly
  2. Verknüpfen Sie die Schaltfläche mit einer Methode in Ihrem ViewController, die signIn: aufruft. Verwenden Sie beispielsweise ein 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. Abmeldeschaltfläche hinzufügen

Fügen Sie Ihrer App eine Abmeldeschaltfläche hinzu, die für angemeldete Nutzer sichtbar ist und die Methode signOut von GIDSignIn aufruft.

Durch den Aufruf von signOut wird der in GIDSignIn gespeicherte Anmeldezustand gelöscht und die Anmeldedaten des Nutzers für Ihre App werden aus dem Keychain entfernt. Ihre App ist für die Aktualisierung ihres eigenen Zustands und der Benutzeroberfläche verantwortlich. Die Abmeldung gilt nur für Ihre App. Der Nutzer wird nicht von anderen Apps oder Diensten abgemeldet und die Berechtigungen, die der Nutzer Ihrer App gewährt hat, werden nicht widerrufen.

SwiftUI verwenden

Fügen Sie in SwiftUI eine Button-Schaltfläche hinzu, die GIDSignIn.sharedInstance.signOut() aufruft:

Button("Sign Out") {
  GIDSignIn.sharedInstance.signOut()
  // Calling signOut() may not automatically trigger UI updates.
  // Update your app's state as needed.
}

UIKit verwenden

Verknüpfen Sie die Schaltfläche mit einer Methode in Ihrem ViewController, die signOut: aufruft. Verwenden Sie beispielsweise ein IBAction:

Swift

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

Objective-C

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

Nächste Schritte

Nachdem sich Nutzer jetzt mit ihren Google-Konten in Ihrer App anmelden können, erfahren Sie hier, wie Sie Folgendes tun: