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

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

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

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

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

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

‫iOS: UIApplicationDelegate

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

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

Swift

@main
struct MyApp: App {

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

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

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

באפליקציות ל-iOS, הפעולה הזו מתבצעת בדרך כלל ב-method‏ UIApplicationDelegate's application:didFinishLaunchingWithOptions: וב-NSApplicationDelegate's 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, מוסיפים קריאה ל-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. מוודאים שהוספתם לפרויקט את יחסי התלות של כפתור הכניסה באמצעות חשבון Google ב-SwiftUI.

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

    import GoogleSignInSwift
    
  3. מוסיפים לחצן 'כניסה באמצעות חשבון Google' לתצוגה ומציינים את הפעולה שתופעל כשלוחצים על הלחצן:

    GoogleSignInButton(action: handleSignInButton)
    
  4. כדי להפעיל את תהליך הכניסה כשלוחצים על הלחצן, מוסיפים קריאה לשיטה GIDSignIn's 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

  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 שלהם, כדאי לקרוא איך: