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

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

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

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

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

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

iOS: UIApplicationApplication היום

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

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

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

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

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

  1. הוספה של 'כניסה באמצעות חשבון Google' לתצוגת הכניסה. אפשר להשתמש כיתה אחת (GIDSignInButton) כדי ליצור לחצן באופן אוטומטי ב-Google מיתוג (מומלץ) או ליצור לחצן משלכם עם עיצוב בהתאמה אישית.

    כדי להוסיף GIDSignInButton לסטוריבורד או לקובץ XIB, יש להוסיף תצוגה ולהגדיר המחלקה המותאמת אישית שלו היא GIDSignInButton. שימו לב שכשמוסיפים GIDSignInButton צפייה בסטוריבורד, לחצן הכניסה לא מוצג בכלי לבניית הממשקים. מפעילים את האפליקציה כדי לראות את לחצן הכניסה.

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

    מאפייני סגנון לחצן GIDSignInSign
    colorScheme kGIDSignInButtonColorSchemeLight
    kGIDSignInButtonColorSchemeDark
    style kGIDSignInButtonStyleStandard
    kGIDSignInButtonStyleWide
    kGIDSignInButtonStyleIconOnly
  2. מחברים את הלחצן ל-method ב-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. מחברים את הלחצן ל-method ב-ViewController שקוראת signOut: לדוגמה, אפשר להזין IBAction:

    Swift

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

    Objective-C

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

השלבים הבאים

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