الوصول إلى Google APIs في تطبيق iOS

توفّر بعض خدمات Google، مثل Drive وGmail وغيرها، واجهات برمجة تطبيقات عامة يمكنك استخدامها لإنشاء تطبيقات تساعد المستخدمين في العمل على بياناتهم في هذه الخدمات. للوصول إلى هذه الخدمات، يجب أن تنفّذ التطبيقات أحد مسارات عملاء OAuth 2.0 للحصول على موافقة المستخدمين ورموز الدخول التي تمنح إذن الوصول إلى واجهات برمجة التطبيقات.

يمكنك استخدام مكتبة "تسجيل الدخول باستخدام حساب Google" التي تنفّذ مسار OAuth 2.0 نيابةً عنك، وذلك للحصول على رموز الدخول للمستخدم الذي سجّل الدخول.

المتطلبات الأساسية

قبل أن يتمكّن تطبيق iOS من طلب Google APIs، أكمِل خطوات الإعداد التالية:

1. تفعيل واجهات برمجة التطبيقات لمشروعك

يجب تفعيل واجهات برمجة التطبيقات في Google Cloud Console لأي تطبيق يستدعي واجهات Google APIs.

لتفعيل واجهة برمجة تطبيقات لمشروعك، اتّبِع الخطوات التالية:

  1. افتح مكتبة واجهات برمجة التطبيقات في Google Cloud Console.
  2. اختَر مشروعًا أو أنشِئ مشروعًا جديدًا إذا طُلب منك ذلك.
  3. اختَر واجهة برمجة التطبيقات التي تريد تفعيلها، ثم انقر على تفعيل.

2. إنشاء بيانات اعتماد التفويض

يجب أن يتوفّر لأي تطبيق iOS يستخدم OAuth 2.0 للوصول إلى Google APIs بيانات اعتماد تفويض تحدّد التطبيق لخادم تفويض Google. توضّح الخطوات التالية كيفية إنشاء بيانات اعتماد لمشروعك:

  1. انتقِل إلى صفحة "بيانات الاعتماد" في وحدة تحكّم Google Cloud.
  2. انقر على إنشاء عميل (أو إنشاء بيانات اعتماد > معرِّف عميل OAuth).
  3. اختَر نوع التطبيق iOS.
  4. أدخِل اسمًا لعميل OAuth. يحدّد هذا الاسم العميل في صفحة "بيانات الاعتماد" الخاصة بمشروعك.
  5. أدخِل معرّف الحزمة لتطبيقك. معرّف الحزمة هو قيمة المفتاح CFBundleIdentifier في ملف Info.plist الخاص بتطبيقك. يتم عرض القيمة عادةً في لوحة "عام" (General) أو لوحة "التوقيع والإمكانات" (Signing & Capabilities) في محرِّر مشروع Xcode، أو في صفحة "معلومات التطبيق" (App Information) على Apple App Store Connect. تأكَّد من استخدام معرّف الحزمة الصحيح، لأنّه لا يمكن تغييره في حال استخدام ميزة "فحص التطبيقات".
  6. (اختياري) أدخِل معرّف App Store لتطبيقك إذا كان التطبيق منشورًا في Apple App Store. معرّف المتجر هو سلسلة رقمية مضمّنة في كل عنوان URL في Apple App Store.
  7. (اختياري) أدخِل معرّف الفريق. يُرجى الاطّلاع على تحديد رقم تعريف الفريق في مستندات حساب المطوّر على Apple. يجب إدخال معرّف الفريق إذا كنت تريد تفعيل ميزة "فحص التطبيقات" لعميلك.
  8. (اختياري) فعِّل ميزة "فحص التطبيقات" لتطبيق iOS. عند تفعيل هذه الميزة، يتم استخدام خدمة App Attest من Apple للتحقّق من أنّ طلبات OAuth 2.0 التي تنشأ من عميل OAuth هي طلبات حقيقية وصادرة من تطبيقك، ما يساعد في تقليل خطر انتحال هوية التطبيق.
  9. انقر على إنشاء.

يتم إنشاء معرِّف العميل وعرضه في وحدة تحكُّم Google Cloud. أضِف مخطّط عنوان URL لمعرّف العميل المعكوس (على سبيل المثال، com.googleusercontent.apps.1234567890-abcdef) إلى Info.plist في تطبيقك للتعامل مع عمليات إعادة التوجيه الخاصة بالتفويض.

3- إكمال عملية الدمج الأساسية لميزة "تسجيل الدخول باستخدام حساب Google"

أكمِل عملية الدمج الأساسية لميزة "تسجيل الدخول باستخدام حساب Google" قبل طلب النطاقات الإضافية واستدعاء واجهات Google APIs.

1. التحقّق من النطاقات التي تم منحها

قبل إجراء طلب إلى 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.
}

Objective-C

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
}

بناءً على ما إذا كان المستخدم قد منح نطاقًا معيّنًا أم لا، قد تحتاج إلى تقديم طلب للحصول على نطاق إضافي من أجل إتاحة تفاعل معيّن.

2. طلب نطاقات إضافية

إذا كنت بحاجة إلى طلب نطاقات إضافية، يمكنك استدعاء 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.
}

Objective-C

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.
}];

3- إجراء طلب بيانات من واجهة برمجة التطبيقات باستخدام رموز مميّزة جديدة

لضمان أن تكون طلبات البيانات من واجهة برمجة التطبيقات في Google تحتوي دائمًا على رموز دخول غير منتهية الصلاحية، يمكنك تضمين الطلبات في كتلة 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()
}

Objective-C

[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 APIs.