این صفحه به شما نشان میدهد که چگونه ورود به سیستم گوگل را در یک برنامه iOS یا macOS ادغام کنید. ممکن است لازم باشد این دستورالعملها را با چرخه عمر برنامه یا مدل رابط کاربری خود تطبیق دهید.
قبل از اینکه شروع کنی
وابستگیها را دانلود کنید، پروژه Xcode خود را پیکربندی کنید و شناسه کلاینت خود را تنظیم کنید .
برای مشاهده نحوه عملکرد ورود به سیستم، برنامه نمونه iOS و macOS ما را امتحان کنید .
۱. مدیریت URL تغییر مسیر احراز هویت
پس از اینکه کاربر با گوگل احراز هویت شد، جریان احراز هویت به همراه یک URL حاوی پاسخ احراز هویت، شامل شناسه کاربر، به برنامه شما هدایت میشود. ارسال این URL به GIDSignIn به SDK اجازه میدهد تا پاسخ را تجزیه و تحلیل کرده و اطلاعات احراز هویت کاربر را به برنامه شما بازگرداند.
iOS: نماینده برنامه UIApplicationDelegate
در application:openURL:options از AppDelegate، متد handleURL: از GIDSignIn را فراخوانی کنید:
سویفت
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
}
هدف-سی
- (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
در AppDelegate برنامه خود، یک هندلر برای رویدادهای
kAEGetURLدرapplicationDidFinishLaunchingثبت کنید:سویفت
func applicationDidFinishLaunching(_ notification: Notification) { // Register for GetURL events. let appleEventManager = NSAppleEventManager.shared() appleEventManager.setEventHandler( self, andSelector: "handleGetURLEvent:replyEvent:", forEventClass: AEEventClass(kInternetEventClass), andEventID: AEEventID(kAEGetURL) ) }هدف-سی
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { // Register for GetURL events. NSAppleEventManager *appleEventManager = [NSAppleEventManager sharedAppleEventManager]; [appleEventManager setEventHandler:self andSelector:@selector(handleGetURLEvent:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL]; }برای این رویدادها، هندلری تعریف کنید که
handleURLمربوط بهGIDSignInرا فراخوانی کند:سویفت
func handleGetURLEvent(event: NSAppleEventDescriptor?, replyEvent: NSAppleEventDescriptor?) { if let urlString = event?.paramDescriptor(forKeyword: AEKeyword(keyDirectObject))?.stringValue{ let url = NSURL(string: urlString) GIDSignIn.sharedInstance.handle(url) } }هدف-سی
- (void)handleGetURLEvent:(NSAppleEventDescriptor *)event withReplyEvent:(NSAppleEventDescriptor *)replyEvent { NSString *URLString = [[event paramDescriptorForKeyword:keyDirectObject] stringValue]; NSURL *URL = [NSURL URLWithString:URLString]; [GIDSignIn.sharedInstance handleURL:url]; }
سویفتیوآی
در پنجره یا صحنه برنامه خود، یک هندلر برای دریافت URL ثبت کنید و handleURL مربوط به GIDSignIn را فراخوانی کنید:
سویفت
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
// ...
.onOpenURL { url in
GIDSignIn.sharedInstance.handle(url)
}
}
}
}
۲. تلاش برای بازیابی وضعیت ورود کاربر
وقتی برنامه شما شروع به کار میکند، تابع restorePreviousSignInWithCallback را فراخوانی کنید تا وضعیت ورود کاربرانی که قبلاً با استفاده از گوگل وارد سیستم شدهاند را بازیابی کنید. انجام این کار تضمین میکند که کاربران هر بار که برنامه شما را باز میکنند، مجبور به ورود به سیستم نباشند (مگر اینکه از سیستم خارج شده باشند).
برنامههای iOS اغلب این کار را در application:didFinishLaunchingWithOptions: از کلاس UIApplicationDelegate و در برنامههای macOS در applicationDidFinishLaunching: از کلاس NSApplicationDelegate انجام میدهند. از نتیجه برای تعیین اینکه کدام view را به کاربر ارائه دهد استفاده کنید. برای مثال:
سویفت
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
}
هدف-سی
- (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 استفاده میکنید، برای نمای اولیه خود، فراخوانی restorePreviousSignIn in onAppear را اضافه کنید:
سویفت
@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`
}
}
}
}
}
۳. دکمه ورود به سیستم گوگل را اضافه کنید
یک دکمه «ورود با گوگل» به نمای ورود خود اضافه کنید. کامپوننتهایی برای SwiftUI و UIKit در دسترس هستند که به طور خودکار دکمهای مطابق با دستورالعملهای برندسازی گوگل ایجاد میکنند.
استفاده از SwiftUI
مطمئن شوید که وابستگی مربوط به دکمه «ورود با گوگل» در SwiftUI را به پروژه خود اضافه کردهاید.
در فایلی که میخواهید دکمه SwiftUI را به آن اضافه کنید، دستور import مورد نیاز را به بالای فایل اضافه کنید:
import GoogleSignInSwiftیک افزونهی
UIApplicationاضافه کنید تا کنترلر نمای ریشهی فعال را برای ارائه بازیابی کند: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 } }یک دکمهی «ورود با گوگل» به View خود اضافه کنید و عملی را که هنگام فشردن دکمه فراخوانی میشود، مشخص کنید:
GoogleSignInButton(action: handleSignInButton)با اضافه کردن فراخوانی
signIn(withPresenting:completion:)ازGIDSignInدر اکشن خود، فرآیند ورود به سیستم را هنگام فشردن دکمه آغاز کنید: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. } }
این از مدل نمای پیشفرض استفاده میکند که اطلاعات استایلبندی استاندارد را برای دکمه ارائه میدهد. برای کنترل ظاهر دکمه، باید یک GoogleSignInButtonViewModel سفارشی ایجاد کنید و آن را به عنوان viewModel در مقداردهی اولیه دکمه با استفاده از GoogleSignInButton(viewModel: yourViewModel, action: yourAction) تنظیم کنید. برای اطلاعات بیشتر به کد منبع GoogleSignInButtonViewModel مراجعه کنید.
استفاده از UIKit
یک دکمه "ورود با گوگل" به نمای ورود خود اضافه کنید. میتوانید از کلاس
GIDSignInButtonبرای تولید خودکار دکمهای با برند گوگل (توصیه میشود) استفاده کنید یا دکمه خودتان را با استایل سفارشی ایجاد کنید.برای افزودن یک
GIDSignInButtonبه یک استوریبورد یا فایل XIB، یک View اضافه کنید و کلاس سفارشی آن را رویGIDSignInButtonتنظیم کنید. توجه داشته باشید که وقتی یک View از نوعGIDSignInButtonرا به استوریبورد خود اضافه میکنید، دکمه ورود در سازنده رابط نمایش داده نمیشود. برنامه را اجرا کنید تا دکمه ورود را ببینید.شما میتوانید ظاهر یک
GIDSignInButtonرا با تنظیم ویژگیهایcolorSchemeوstyleآن سفارشی کنید:ویژگیهای استایل دکمهی GIDSignInButton colorSchemekGIDSignInButtonColorSchemeLight
kGIDSignInButtonColorSchemeDarkstylekGIDSignInButtonStyleStandard
kGIDSignInButtonStyleWide
kGIDSignInButtonStyleIconOnlyدکمه را به متدی در ViewController خود که
signIn:فراخوانی میکند، متصل کنید. برای مثال، از یکIBActionاستفاده کنید:سویفت
@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. } }هدف-سی
- (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. }]; }
۴. دکمه خروج را اضافه کنید
یک دکمهی خروج به برنامهی خود اضافه کنید که برای کاربران وارد شده قابل مشاهده باشد و متد signOut از GIDSignIn را فراخوانی کند.
فراخوانی signOut وضعیت ورود به سیستم ذخیره شده در GIDSignIn را پاک میکند و اطلاعات کاربری کاربر برای برنامه شما را از Keychain حذف میکند. برنامه شما مسئول بهروزرسانی وضعیت و رابط کاربری خود است. خروج از سیستم فقط برای برنامه شما اعمال میشود. این خروج، کاربر را از سایر برنامهها یا سرویسها خارج نمیکند و مجوزهایی را که کاربر به برنامه شما اعطا کرده است، لغو نمیکند.
استفاده از SwiftUI
در SwiftUI، یک Button (Button) اضافه کنید که GIDSignIn.sharedInstance.signOut() را فراخوانی کند:
Button("Sign Out") {
GIDSignIn.sharedInstance.signOut()
// Calling signOut() may not automatically trigger UI updates.
// Update your app's state as needed.
}
استفاده از UIKit
دکمه را به متدی در ViewController خود که signOut: متصل کنید. برای مثال، از یک IBAction استفاده کنید:
سویفت
@IBAction func signOut(sender: Any) {
GIDSignIn.sharedInstance.signOut()
}
هدف-سی
- (IBAction)signOut:(id)sender {
[GIDSignIn.sharedInstance signOut];
}
مراحل بعدی
اکنون که کاربران میتوانند با استفاده از حسابهای گوگل خود وارد برنامه شما شوند، یاد بگیرید چگونه:
- اطلاعات پروفایل حساب گوگل کاربران را دریافت کنید .
- با استفاده از توکن شناسه گوگل کاربر ، با پشتیبان خود احراز هویت کنید .
- از طرف کاربر، APIهای گوگل را فراخوانی کنید .