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

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

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

רוצה לנסות את הדוגמה?

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

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

איך זה עובד

אלה השלבים שאפליקציית Google והאפליקציה שלך מבצעים היפוך האפליקציות:

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

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

  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): Google client_id שרשום באפליקציה שלך.
  • scope (List of String): התקבלה בקשה לרשימה של היקפים המופרדים ברווחים.
  • state (String): צופן חד-פעמי ש-Google משתמשת בו כדי לאמת שההרשאה בתגובה לבקשה היוצאת של Google.
  • redirect_uri (String): הקישור האוניברסלי של Google. "היפוך" 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 כדי להבטיח שהחלופה המתאימה מופעלת.

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

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

  • אפליקציית 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 Assistant
    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.