שילוב של כניסה באמצעות חשבון Google באפליקציה ל-iOS או ל-macOS

בדף הזה מוסבר איך לשלב כניסה באמצעות חשבון Google באפליקציה ל-iOS או ל-macOS. יכול להיות שתצטרכו להתאים את ההוראות האלה למודל של מחזור החיים או ממשק המשתמש של האפליקציה.

לפני שמתחילים

מורידים את יחסי התלות, מגדירים את פרויקט Xcode ומגדירים את מזהה הלקוח.

אתם יכולים לנסות את האפליקציה לדוגמה שלנו ל-iOS ול-macOS כדי לראות איך הכניסה פועלת.

1. טיפול בכתובת ה-URL להפניה אוטומטית לאימות

iOS: UIApplicationDelegate

בשיטה application:openURL:options של AppDelegate, קוראים ל-method handleURL: של 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

  1. ב-AppDelegate של האפליקציה שלך, רישום handler לאירועי 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];
    }
    
  2. מגדירים את ה-handler לאירועים האלה שקוראים ל-handleURL של GIDSignIn:

    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

בחלון או בסצנה של האפליקציה, רושמים handler כדי לקבל את כתובת ה-URL וקוראים ל-handleURL של GIDSignIn:

Swift

@main
struct MyApp: App {

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

2. ניסיון לשחזר את מצב הכניסה של המשתמש

כשהאפליקציה מופעלת, קוראים ל-restorePreviousSignInWithCallback כדי לנסות לשחזר את מצב הכניסה של משתמשים שכבר נכנסו באמצעות Google. כך תוכלו להבטיח שהמשתמשים לא יצטרכו להיכנס בכל פעם שהם פותחים את האפליקציה (אלא אם הם יצאו מהחשבון).

אפליקציות ל-iOS עושות זאת בדרך כלל בשיטה application:didFinishLaunchingWithOptions: של UIApplicationDelegate וב-applicationDidFinishLaunching: של NSApplicationDelegate לאפליקציות 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, מוסיפים שיחה ל-restorePreviousSignIn ב-onAppear לתצוגה הראשונית:

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

  1. חשוב לוודא שהוספתם לפרויקט את תלות הלחצן 'Sign in with Google' (כניסה באמצעות חשבון Google) ב-SwiftUI.

  2. בקובץ שאליו רוצים להוסיף את לחצן SwiftUI, מוסיפים את הייבוא הנדרש בחלק העליון של הקובץ:

    import GoogleSignInSwift
    
  3. מוסיפים לתצוגה לחצן 'Sign in with Google' (כניסה באמצעות חשבון 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, צריך להוסיף תצוגה ולהגדיר את המחלקה בהתאמה אישית ל-GIDSignInButton. שימו לב שכאשר מוסיפים תצוגה מסוג GIDSignInButton לסטוריבורד, לחצן הכניסה לא מופיע בבונה הממשקים. מפעילים את האפליקציה כדי לראות את לחצן הכניסה.

    אפשר להתאים אישית את המראה של GIDSignInButton על ידי הגדרת המאפיינים colorScheme ו-style שלו:

    מאפייני סגנון GIDSignInButton
    colorScheme kGIDSignInButtonColorSchemeLight
    kGIDSignInButtonColorSchemeDark
    style kGIDSignInButtonStyleStandard
    kGIDSignInButtonStyleWide
    kGIDSignInButtonStyleIconOnly
  2. מחברים את הלחצן לשיטה ב-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. הוספת לחצן יציאה

  1. להוסיף לאפליקציה לחצן יציאה שיוצג למשתמשים מחוברים.

  2. מחברים את הלחצן לשיטה ב-ViewController שקוראת ל-signOut:. לדוגמה, אפשר להשתמש ב-IBAction:

    Swift

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

    Objective-C

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

השלבים הבאים

עכשיו, כשהמשתמשים יכולים להיכנס לאפליקציה באמצעות חשבונות Google שלהם, תוכלו ללמוד איך: