التطبيق العكسي لنظام التشغيل iOS

يفتح رابط App Flip المستند إلى OAuth (App Flip) تطبيق iOS الخاص بك من تطبيق Google لمساعدة مستخدم تطبيق Google على ربط حساباتهم بسهولة أكبر. تحتاج إلى إجراء تغييرات طفيفة على التعليمات البرمجية لتطبيق iOS الخاص بك لتنفيذ هذه الميزة.

في هذا المستند ، ستتعرف على كيفية تعديل تطبيق iOS الخاص بك لدعم App Flip.

جرب العينة

التطبيق فليب عينة التطبيق يدل على حساب ربط التكامل في دائرة الرقابة الداخلية هذا التطبيق متوافق مع فليب. يمكنك استخدام هذا التطبيق للتحقق من كيفية الرد على الرابط العام لتطبيق Flip من تطبيقات Google للجوال.

وتكوينها التطبيق عينة على الاندماج مع الوجه أداة اختبار التطبيقات لدائرة الرقابة الداخلية ، والتي يمكنك استخدامها للتحقق من تكامل بك دائرة الرقابة الداخلية التطبيق مع التطبيقات الوجه قبل حساب تكوين ربط مع جوجل. يحاكي هذا التطبيق الارتباط العام الذي يتم تشغيله بواسطة تطبيقات Google للجوّال عند تمكين App Flip.

كيف تعمل

فيما يلي خطوات التدفق التي يتخذها تطبيق Google وتطبيقك عند حدوث "قلب التطبيق":

  1. يحاول تطبيق Google فتح الرابط العام لتطبيقك. يمكنه فتح تطبيقك إذا كان مثبتًا على جهاز المستخدم ومرتبطًا بالرابط العام. نرى دعم عالمي سريعة للحصول على التفاصيل.

  2. الشيكات التطبيق أن client_id و redirect_uri المعلمة المرمزة في URL الواردة يطابق رابط جوجل العالمية المتوقعة.

  3. يطلب تطبيقك رمز تفويض من خادم OAuth2. في نهاية هذا التدفق ، يُرجع تطبيقك إما رمز تفويض أو خطأ إلى تطبيق Google. للقيام بذلك ، يفتح الرابط العالمي لـ Google بالمعلمات الملحقة لرمز التفويض أو الخطأ.

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

قم بتعديل تطبيق iOS الخاص بك لدعم App Flip

لدعم App Flip ، قم بإجراء التغييرات التالية على التعليمات البرمجية لتطبيق iOS الخاص بك:

  1. التعامل مع NSUserActivityTypeBrowsingWeb في التطبيق الخاص بك مندوب.
  2. القبض على redirect_uri و state المعلمات من URL لاستخدامها لاحقا.
  3. تأكد من أن redirect_uri مباريات هذا التنسيق:
    https://oauth-redirect.googleusercontent.com/a/GOOGLE_APP_BUNDLE_ID
    https://oauth-redirect-sandbox.googleusercontent.com/a/GOOGLE_APP_BUNDLE_ID
  4. تحقق من أن معرّف العميل يطابق القيمة المتوقعة. استخدم نموذج التعليمات البرمجية التالي:

    func application(_ application: UIApplication,
                     continue userActivity: NSUserActivity,
                     restorationHandler: @escaping ([Any]?) -> Void) -> Bool
    {
        guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
            let incomingURL = userActivity.webpageURL,
            let components = URLComponents(url: incomingURL, resolvingAgainstBaseURL: false),
            let params = components.queryItems else {
                return false
        }
    
        if let clientId = params.filter({$0.name == "client_id"}).first?.value,
            let state = params.filter({$0.name == "state"}).first?.value,
            let redirectUri = params.filter({$0.name == "redirect_uri"}).first?.value {
    
            // Save the redirect_uri and state for later...
    
            // Verify the client id
            return (clientId == GOOGLE_CLIENT_ID)
        } else {
            // Missing required parameters
            return false
        }
    }
    
  5. بعد الحصول على تفويض ناجح ، اتصل بـ URI لإعادة التوجيه باستخدام كود التفويض. استخدم نموذج التعليمات البرمجية التالي:

    func returnAuthCode(code: String, state: String, redirectUri: String) {
        var redirectURL = URL(string: redirectUri)
        var components = URLComponents(url: redirectURL, resolvingAgainstBaseURL: false)
    
        // Return the authorization code and original state
        let paramAuthCode = URLQueryItem(name: "code", value: code)
        let paramState = URLQueryItem(name: "state", value: state)
        components?.queryItems = [paramAuthCode, paramState]
        if let resultURL = components?.url {
            UIApplication.shared.open(
                resultURL,
                options: [UIApplicationOpenURLOptionUniversalLinksOnly : true],
                completionHandler: nil)
        }
    }
    
  6. إذا حدث خطأ ، فقم بإرفاق نتيجة خطأ بـ URI لإعادة التوجيه بدلاً من ذلك. استخدم نموذج التعليمات البرمجية التالي:

    func returnError(redirectUri: String) {
        var redirectURL = URL(string: redirectUri)
        var components = URLComponents(url: redirectURL, resolvingAgainstBaseURL: false)
    
        // Return the authorization code and original state
        let paramError = URLQueryItem(name: "error", value: "invalid_request")
        let paramDescription = URLQueryItem(name: "error_description", value: "Invalid Request")
        components?.queryItems = [paramError, paramDescription]
        if let resultURL = components?.url {
            UIApplication.shared.open(
                resultURL,
                options: [UIApplicationOpenURLOptionUniversalLinksOnly : true],
                completionHandler: nil)
        }
    }
    

عند فتحه بواسطة تطبيق Google ، يشتمل الرابط العام لتطبيقك على معامِلات طلب البحث التالية:

  • client_id ( String ): جوجل client_id أن المسجل تحت التطبيق الخاص بك.
  • scope ( List of String ): قائمة نطاقات مفصولة مساحة المطلوبة.
  • state ( String ): A حالية تستخدمه جوجل للتحقق من أن النتيجة إذن هي استجابة لطلب جوجل المنتهية ولايته.
  • redirect_uri ( String ): رابط جوجل العالمي. عنوان URI "انعكاس" لفتح تطبيق Google وتمرير النتائج.

المعلمات المستخدمة عند إرجاع نتيجة التفويض بنجاح:

  • code ( String ): قيمة رمز إذن، إذا كانت متوفرة.
  • state ( String ): إن القيمة الدقيقة الواردة من رابط عالمي واردة.

المعلمات المستخدمة عند إرجاع نتيجة التفويض دون نجاح:

  • error ( String )، مع القيم التالية:

    • cancelled : خطأ للاسترداد. سيحاول تطبيق Google ربط الحساب باستخدام عنوان URL للترخيص. بعض الأمثلة هي فشل المستخدم في تسجيل الدخول ، أو وجود جهاز غير متصل بالإنترنت أو انتهاء مهلة الاتصال.
    • unrecoverable : حدث خطأ غير قابل للاسترداد. على سبيل المثال ، يحاول المستخدم الارتباط بحساب معطل ، وسيقوم تطبيق Google بإلغاء ربط الحساب.
    • invalid_request : طلب المعلمات غير صالحة أو مفقودة. هذا خطأ قابل للاسترداد. سيحاول تطبيق Google ربط الحساب باستخدام عنوان URL للترخيص.
    • access_denied : المستخدم يرفض طلب الموافقة. هذا خطأ غير قابل للاسترداد ؛ تطبيق Google يحبط الربط.
  • error_description ( String ، اختياري): رسالة خطأ سهل الاستعمال.

لجميع أنواع الخطأ، يجب إرجاع البيانات استجابة لالمحدد REDIRECT_URI لضمان trigerred وتراجع المناسب.

قم بتعديل نقطة نهاية التفويض الخاصة بك لدعم App Flip

قم بتكوين النظام الأساسي الخاص بك لقبول الطلبات باستخدام عناوين URL لإعادة توجيه App Flip من Google:

  • صفحة Google الرئيسية التطبيق
    https://oauth-redirect.googleusercontent.com/a/com.google.Chromecast.dev
    https://oauth-redirect.googleusercontent.com/a/com.google.Chromecast.enterprise
    https://oauth-redirect.googleusercontent.com/a/com.google.Chromecast
    https://oauth-redirect-sandbox.googleusercontent.com/a/com.google.Chromecast.dev
    https://oauth-redirect-sandbox.googleusercontent.com/a/com.google.Chromecast.enterprise
    https://oauth-redirect-sandbox.googleusercontent.com/a/com.google.Chromecast
    
  • مساعد جوجل التطبيق
    https://oauth-redirect.googleusercontent.com/a/com.google.OPA.dev
    https://oauth-redirect.googleusercontent.com/a/com.google.OPA.enterprise
    https://oauth-redirect.googleusercontent.com/a/com.google.OPA
    https://oauth-redirect-sandbox.googleusercontent.com/a/com.google.OPA.dev
    https://oauth-redirect-sandbox.googleusercontent.com/a/com.google.OPA.enterprise
    https://oauth-redirect-sandbox.googleusercontent.com/a/com.google.OPA
    

تأكد من أن client_id وURL المحدد من قبل redirect_uri المعلمة تتطابق مع القيم المتوقعة عند تلقي الطلب. إذا فشل التحقق العميل إرجاع الخطأ invalid_request إلى redirect_uri .