אפליקציית Flip ל-iOS

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

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

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

האפליקציה לדוגמה של 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 שקודדו בכתובת ה-URL הנכנסת תואמים לקישור האוניברסלי הצפוי של Google.

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

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

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

כדי לתמוך ב-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.rc
    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.rc
    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.rc
    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.rc
    https://oauth-redirect-sandbox.googleusercontent.com/a/com.google.OPA
    

צריך לוודא ש-client_id וכתובת ה-URL שצוינו על ידי הפרמטר redirect_uri תואמים לערכים המצופים כשבקשה מתקבלת. אם האימות של הלקוח נכשל, מחזירה את השגיאה invalid_request ל-redirect_uri.