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

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

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

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

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

iOS: הענקת גישה לממשק המשתמש

בשיטת application:openURL:options של Appassign, מפעילים את השיטה 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: NSApplicationRequest

  1. ב-Appassign של האפליקציה רושמים 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. מוסיפים לחצן כניסה באמצעות חשבון 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 שלהם, כדאי לך ללמוד איך: