دسترسی به Google API در برنامه iOS

برخی‌از سرویس‌های Google، مثل Drive،‏ Gmail، و بسیاری دیگر، میاناهای برنامه‌سازی کاربردی عمومی ارائه می‌دهند که می‌توانید از آن‌ها برای ایجاد برنامه‌هایی استفاده کنید که به کاربران کمک می‌کنند با داده‌هایشان در این سرویس‌ها کار کنند. برای دسترسی به این سرویس‌ها، برنامه‌ها باید یکی از جریان‌های کارخواه OAuth 2.0 را پیاده‌سازی کنند تا رضایت کاربران را جلب کنند و کدهای دسترسی را دریافت کنند که دسترسی به میاناهای برنامه‌سازی کاربردی را اعطا می‌کند.

می‌توانید از کتابخانه «ورود به سیستم با Google» که جریان OAuth 2.0 را برای شما پیاده‌سازی می‌کند، برای دریافت کد دسترسی برای کاربر واردشده به سیستم استفاده کنید.

پیش‌نیازها

قبل‌از اینکه برنامه iOS شما بتواند Google APIs را فراخوانی کند، مراحل راه‌اندازی زیر را تکمیل کنید:

۱. فعال کردن میاناهای برنامه‌سازی کاربردی برای پروژه

هر برنامه‌ای که Google APIs را فراخوانی می‌کند باید آن Google APIs را در کنسول Google Cloud فعال کند.

برای فعال کردن میانای برنامه‌سازی کاربردی برای پروژه‌تان:

  1. کتابخانه میانای برنامه‌سازی کاربردی را در کنسول Google Cloud باز کنید.
  2. درصورت درخواست، پروژه‌ای را انتخاب کنید یا پروژه جدیدی ایجاد کنید.
  3. میانای برنامه‌سازی کاربردی موردنظرتان را برای فعال کردن انتخاب کنید، سپس روی فعال کردن کلیک کنید.

۲. ایجاد اعتبارنامه مجوز

هر برنامه iOS که از OAuth 2.0 برای دسترسی به Google APIs استفاده می‌کند باید اعتبارنامه مجوز داشته باشد که برنامه را برای سرور مجوز Google شناسایی کند. مراحل زیر نحوه ایجاد اطلاعات کاربری برای پروژه‌تان را توضیح می‌دهد:

  1. به صفحه اطلاعات کاربری در کنسول Google Cloud بروید.
  2. روی ایجاد کارخواه (یا ایجاد اعتبارنامه > شناسه کارخواه OAuth) کلیک کنید.
  3. نوع برنامه iOS را انتخاب کنید.
  4. نامی برای کارخواه OAuth وارد کنید. این نام، کارخواه را در صفحه «اطلاعات کاربری» پروژه شما مشخص می‌کند.
  5. شناسه دسته نرم‌افزاری برنامه‌تان را وارد کنید. شناسه دسته نرم‌افزاری مقدار کلید CFBundleIdentifier در Info.plist برنامه‌تان است. این مقدار معمولاً در قاب «عمومی» یا قاب «امضا و قابلیت‌ها» در ویرایشگر پروژه Xcode، یا در صفحه «اطلاعات برنامه» در Apple App Store Connect نمایش داده می‌شود. مطمئن شوید که از شناسه دسته نرم‌افزاری صحیح استفاده می‌کنید، زیرا اگر از «بررسی برنامه» استفاده کنید، نمی‌توانید آن را تغییر دهید.
  6. (اختیاری) اگر برنامه در Apple App Store منتشر شده است، شناسه App Store برنامه‌تان را وارد کنید. «شناسه فروشگاه» رشته‌ای عددی است که در هر نشانی وب Apple App Store وجود دارد.
  7. (اختیاری) شناسه تیمتان را وارد کنید. به پیدا کردن شناسه تیم در سند حساب توسعه‌دهنده Apple مراجعه کنید. اگر «بررسی برنامه» را برای کارخواهتان فعال کنید، «شناسه تیم» الزامی است.
  8. (اختیاری) «بررسی برنامه» را برای برنامه iOS خود فعال کنید. وقتی «بررسی برنامه» را فعال می‌کنید، از سرویس App Attest Apple برای تأیید اینکه درخواست‌های OAuth 2.0 که از کارخواه OAuth شما منشأ می‌گیرند واقعی هستند و از برنامه شما می‌آیند استفاده می‌شود، که به کاهش خطر جعل هویت برنامه کمک می‌کند.
  9. روی ایجاد کردن کلیک کنید.

شناسه کارخواه شما در کنسول Google Cloud تولید و نمایش داده می‌شود. طرح‌واره نشانی وب شناسه مشتری معکوس (برای مثال، com.googleusercontent.apps.1234567890-abcdef) را به Info.plist برنامه‌تان اضافه کنید تا هدایت‌های مجدد مجوز را مدیریت کنید.

۳. تکمیل ادغام اولیه «ورود به سیستم با Google»

پیش‌از درخواست کردن دامنه‌های افزایشی و فراخوانی Google APIs، ادغام پایه «ورود به سیستم با Google» را تکمیل کنید.

۱. بررسی کنید کدام دامنه‌ها اعطا شده است

قبل‌از اینکه با Google API تماس بگیرید، بااستفاده از ویژگی grantedScopes از GIDGoogleUser بررسی کنید که کدام دامنه‌ها قبلاً به برنامه شما اعطا شده است:

Swift

let driveScope = "https://www.googleapis.com/auth/drive.readonly"
let grantedScopes = user.grantedScopes
if grantedScopes == nil || !grantedScopes!.contains(driveScope) {
  // Request additional Drive scope.
}

آبجکتیو-سی

NSString *driveScope = @"https://www.googleapis.com/auth/drive.readonly";

// Check if the user has granted the Drive scope
if (![user.grantedScopes containsObject:driveScope]) {
  // request additional drive scope
}

بسته به اینکه کاربر دامنه خاصی را اعطا کرده است یا نه، ممکن است لازم باشد برای پشتیبانی از تعاملی خاص، برای دامنه دیگری درخواست دهید.

۲. درخواست حوزه‌های بیشتر

اگر لازم است دامنه‌های بیشتری درخواست کنید، addScopes:presentingViewController:completion یا addScopes:presentingWindow:completion را فراخوانی کنید تا از کاربر بخواهید دسترسی بیشتری به برنامه‌تان اعطا کند.

برای مثال، برای درخواست دسترسی فقط خواندنی به فایل‌های Drive کاربر:

Swift

let additionalScopes = ["https://www.googleapis.com/auth/drive.readonly"]
guard let currentUser = GIDSignIn.sharedInstance.currentUser else {
    return ;  /* Not signed in. */
}

currentUser.addScopes(additionalScopes, presenting: self) { signInResult, error in
    guard error == nil else { return }
    guard let signInResult = signInResult else { return }

    // Check if the user granted access to the scopes you requested.
}

آبجکتیو-سی

NSArray *additionalScopes = @[ @"https://www.googleapis.com/auth/drive.readonly" ];
GIDGoogleUser *currentUser = GIDSignIn.sharedInstance.currentUser;

[currentUser addScopes:additionalScopes
           presentingViewController:self
                         completion:^(GIDSignInResult * _Nullable signInResult,
                                      NSError * _Nullable error) {
    if (error) { return; }
    if (signInResult == nil) { return; }

    // Check if the user granted access to the scopes you requested.
}];

۳. بااستفاده از توکن‌های جدید، فراخوانی میانای برنامه‌سازی کاربردی انجام دهید

برای اطمینان از اینکه فراخوانی‌های Google API شما همیشه کد دسترسی منقضی‌نشده پیوست‌شده داشته باشند، فراخوانی‌ها را در بلوک refreshTokensIfNeededWithCompletion: قرار دهید:

Swift

currentUser.refreshTokensIfNeeded { user, error in
    guard error == nil else { return }
    guard let user = user else { return }

    // Get the access token to attach it to a REST or gRPC request.
    let accessToken = user.accessToken.tokenString

    // Or, get an object that conforms to GTMFetcherAuthorizationProtocol for
    // use with GTMAppAuth and the Google APIs client library.
    let authorizer = user.fetcherAuthorizer()
}

آبجکتیو-سی

[currentUser refreshTokensIfNeededWithCompletion:^(
                              GIDGoogleUser * _Nullable user,
                              NSError * _Nullable error) {
    if (error) { return; }
    if (user == nil) { return; }

    // Get the access token to attach it to a REST or gRPC request.
    NSString *accessToken = user.accessToken.tokenString;

    // Or, get an object that conforms to GTMFetcherAuthorizationProtocol for
    // use with GTMAppAuth and the Google APIs client library.
    id<GTMFetcherAuthorizationProtocol> authorizer = [user fetcherAuthorizer];
}];

از کد دسترسی برای فراخوانی میانای برنامه‌سازی کاربردی استفاده کنید، یا با گنجاندن کد دسترسی در سرصفحه درخواست REST یا gRPC (Authorization: Bearer ACCESS_TOKEN)، یا بااستفاده از مجوزدهنده واکشی با کتابخانه کارخواه میاناهای برنامه‌سازی کاربردی Google.