توضّح لك هذه الصفحة كيفية دمج ميزة "تسجيل الدخول باستخدام حساب Google" في تطبيق iOS أو macOS. قد تحتاج إلى تعديل هذه التعليمات لتناسب مراحل نشاط تطبيقك أو نموذج واجهة المستخدم.
قبل البدء
تنزيل العناصر التابعة وإعداد مشروع Xcode وتحديد معرّف العميل
جرِّب نموذج تطبيقنا على iOS وmacOS لمعرفة طريقة عمل ميزة "تسجيل الدخول باستخدام حساب Google".
1. التعامل مع عنوان URL لإعادة التوجيه الخاص بالمصادقة
بعد أن يصادق المستخدم على هويته باستخدام Google، تعيد عملية المصادقة توجيهه إلى تطبيقك باستخدام عنوان URL يتضمّن استجابة المصادقة، بما في ذلك رمز التعريف الخاص بالمستخدم. يؤدي تمرير عنوان URL هذا إلى GIDSignIn إلى السماح لحزمة تطوير البرامج (SDK) بتحليل الرد وإرجاع بيانات اعتماد المستخدم إلى تطبيقك.
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
في AppDelegate الخاص بتطبيقك، سجِّل معالجًا لأحداث
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]; }حدِّد معالجًا لهذه الأحداث يستدعي
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
في نافذة تطبيقك أو مشهده، سجِّل معالجًا لتلقّي عنوان 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 هذه العملية غالبًا في طريقة UIApplicationDelegate's
application:didFinishLaunchingWithOptions:، بينما تنفّذها تطبيقات macOS في NSApplicationDelegate's applicationDidFinishLaunching:. استخدِم النتيجة لتحديد طريقة العرض التي ستظهر للمستخدم. على سبيل المثال:
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
تأكَّد من أنّك أضفت الاعتمادية الخاصة بزر "تسجيل الدخول باستخدام حساب Google" في SwiftUI إلى مشروعك.
في الملف الذي تريد إضافة زر SwiftUI إليه، أضِف عملية الاستيراد المطلوبة إلى أعلى الملف:
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 } }أضِف زر "تسجيل الدخول باستخدام حساب Google" إلى طريقة العرض وحدِّد الإجراء الذي سيتم تنفيذه عند الضغط على الزر:
GoogleSignInButton(action: handleSignInButton)ابدأ عملية تسجيل الدخول عند الضغط على الزر من خلال إضافة استدعاء إلى طريقة
GIDSignInفيsignIn(withPresenting:completion:)في الإجراء الخاص بك: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
أضِف زر "تسجيل الدخول باستخدام حساب Google" إلى طريقة عرض تسجيل الدخول. يمكنك استخدام الفئة
GIDSignInButtonلإنشاء زر تلقائيًا يتضمّن العلامة التجارية من Google (ننصح بذلك) أو إنشاء زر خاص بك باستخدام أنماط مخصّصة.لإضافة
GIDSignInButtonإلى لوحة عرض أو ملف XIB، أضِف View واضبط فئته المخصّصة علىGIDSignInButton. يُرجى العِلم أنّه عند إضافةGIDSignInButtonعرض إلى لوحة العرض، لن يتم عرض زر تسجيل الدخول في "أداة إنشاء واجهات المستخدم". شغِّل التطبيق للاطّلاع على زر تسجيل الدخول.يمكنك تخصيص مظهر
GIDSignInButtonمن خلال ضبط خصائصcolorSchemeوstyle:خصائص نمط GIDSignInButton colorSchemekGIDSignInButtonColorSchemeLight
kGIDSignInButtonColorSchemeDarkstylekGIDSignInButtonStyleStandard
kGIDSignInButtonStyleWide
kGIDSignInButtonStyleIconOnlyاربط الزر بطريقة في 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. إضافة زر تسجيل الخروج
أضِف زر تسجيل خروج إلى تطبيقك يظهر للمستخدمين الذين سجّلوا الدخول، ويستدعي طريقة signOut في GIDSignIn.
يؤدي استدعاء signOut إلى محو حالة تسجيل الدخول المخزَّنة في GIDSignIn وإزالة بيانات اعتماد المستخدم لتطبيقك من Keychain. ويتحمّل تطبيقك مسؤولية تعديل حالته وواجهة المستخدم الخاصة به. لا ينطبق تسجيل الخروج إلا على تطبيقك، ولا يؤدي إلى تسجيل خروج المستخدم من التطبيقات أو الخدمات الأخرى، كما أنّه لا يؤدي إلى إبطال الأذونات التي منحها المستخدم لتطبيقك.
استخدام SwiftUI
في SwiftUI، أضِف 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:
Swift
@IBAction func signOut(sender: Any) {
GIDSignIn.sharedInstance.signOut()
}
Objective-C
- (IBAction)signOut:(id)sender {
[GIDSignIn.sharedInstance signOut];
}
الخطوات التالية
بعد أن أصبح بإمكان المستخدمين تسجيل الدخول إلى تطبيقك باستخدام حساباتهم على Google، تعرَّف على كيفية تنفيذ ما يلي:
- الحصول على معلومات الملف الشخصي لحسابات المستخدمين على Google
- المصادقة باستخدام الخلفية باستخدام رمز مميّز لمعرّف Google الخاص بالمستخدم
- طلب البيانات من Google APIs بالنيابة عن المستخدم