היפוך האפליקציה ל-iOS

קישור App Flip מבוסס OAuth (App Flip) פותח את אפליקציית iOS שלך מאפליקציית Google כדי לעזור למשתמש Google app לקשר את חשבונו ביתר קלות. עליך לבצע שינויים קלים בקוד באפליקציית iOS שלך כדי ליישם תכונה זו.

במסמך זה, אתה לומד כיצד לשנות את אפליקציית iOS שלך כך שתתמוך ב-App Flip.

נסה את הדוגמה

אהפוך App האפליקציה לדוגמא הדגים חשבון המקשר אינטגרציה על iOS זה App Flip-תואם. אתה יכול להשתמש באפליקציה זו כדי לאמת כיצד להגיב לקישור אוניברסלי של App Flip נכנס מאפליקציות Google לנייד.

אפליקציית מדגם מוגדר מראש לשלב עם כלי App Flip מבחן עבור iOS , שבו ניתן להשתמש כדי לוודא שילוב של אפליקציית iOS שלך עם Flip App לפני שתגדיר חשבון מקשרים עם גוגל. אפליקציה זו מדמה את הקישור האוניברסלי המופעל על ידי אפליקציות Google לנייד כאשר App Flip מופעל.

איך זה עובד

להלן שלבי הזרימה ש-Google app והאפליקציה שלך נוקטות כאשר מתרחשת App Flip:

  1. Google app מנסה לפתוח את הקישור האוניברסלי של האפליקציה שלך. זה יכול לפתוח את האפליקציה שלך אם היא מותקנת במכשיר של המשתמש ומשויכת לקישור האוניברסלי. ראה תמיכת יוניברסל קישורים לפרטים.

  2. בדיקות האפליקציה שלך כי client_id ו redirect_uri פרמטר המקודדים ב- URL נכנסות תואם את הקישור אוניברסלי גוגל צפויה.

  3. האפליקציה שלך מבקשת קוד הרשאה משרת OAuth2 שלך. בסוף זרימה זו, האפליקציה שלך מחזירה לאפליקציית Google קוד הרשאה או שגיאה. לשם כך, הוא פותח את הקישור האוניברסלי של גוגל עם פרמטרים מצורפים עבור קוד ההרשאה או השגיאה.

  4. אפליקציית גוגל מטפלת בקישור האוניברסלי הנכנס של גוגל וממשיכה עם שאר הזרימה. אם מסופק קוד הרשאה, הקישור יושלם באופן מיידי. חילופי האסימונים מתרחשים בין שרת לשרת, באותה צורה שהיא מתרחשת בזרימת קישור OAuth מבוססת דפדפן. אם מוחזר קוד שגיאה, זרימת הקישור ממשיכה עם האפשרויות החלופיות.

שנה את אפליקציית iOS שלך כך שתתמוך ב-App Flip

כדי לתמוך ב-App Flip, בצע את שינויי הקוד הבאים באפליקציית iOS שלך:

  1. טפל NSUserActivityTypeBrowsingWeb ב delegate של היישום שלך.
  2. לכידת redirect_uri ואת state הפרמטרים מכתובת האתר להשתמש מאוחר יותר.
  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 app, הקישור האוניברסלי של האפליקציה שלך כולל את פרמטרי השאילתה הבאים:

  • client_id ( String ): Google client_id כפי שהוא רשום תחת האפליקציה שלך.
  • scope ( List of String ): רשימת הטווחים מופרד בשטח הנדרש.
  • state ( String ): A הוה בשימוש על ידי גוגל כדי לוודא שתוצאת האישור בתגובה לבקשה היוצאת של גוגל.
  • redirect_uri ( String ): קישור האוניברסלי של Google. ה-URI "היפוך" כדי לפתוח את אפליקציית Google ולהעביר תוצאות.

פרמטרים המשמשים כאשר תוצאת ההרשאה מוחזרת בהצלחה:

  • code ( String ): שווי קוד האישור, אם זמין.
  • state ( String ): הערך המדויק קבל מהקישור אוניוורסלי הנכנס.

פרמטרים המשמשים כאשר תוצאת ההרשאה הוחזרה ללא הצלחה:

  • error ( String ), עם הערכים הבאים:

    • cancelled : שגיאת השבה. אפליקציית Google תנסה לקשר חשבון באמצעות כתובת האתר של ההרשאה. כמה דוגמאות הן שהמשתמש נכשל בכניסה, מכשיר במצב לא מקוון או פסק זמן של חיבור.
    • unrecoverable : שגיאה בלתי הפיכה. לדוגמה, המשתמש מנסה לקשר עם חשבון מושבת. האפליקציה של Google תבטל את קישור החשבון.
    • invalid_request : בקשת פרמטרים אינם חוקיים או חסר. זוהי שגיאה הניתנת לשחזור. אפליקציית Google תנסה לקשר חשבון באמצעות כתובת האתר של ההרשאה.
    • access_denied : המשתמש דוחה את בקשת ההסכמה. זוהי שגיאה שאינה ניתנת לשחזור; אפליקציית Google מבטלת את הקישור.
  • error_description ( String , אופציונלי): הודעת שגיאה ידידותי למשתמש.

עבור כל סוגי השגיאה, אתה חייב להחזיר את הנתונים בתגובה שצוין REDIRECT_URI כדי להבטיח את fallback המתאים trigerred.

שנה את נקודת הקצה של ההרשאה שלך כדי לתמוך ב-App Flip

הגדר את הפלטפורמה שלך לקבלת בקשות באמצעות כתובות האתרים להפניה מחדש של App Flip של Google:

  • אפליקציית Google Home
    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
    
  • האפליקציה עוזרת Google
    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 .