App Flip para iOS

El vínculo de cambio de app basado en OAuth (cambio de app) abre tu app para iOS desde una app de Google. para ayudar al usuario de la app de Google a vincular su cuenta con mayor facilidad. Debes hacer cambios menores en el código de tu app para iOS para implementar esta función.

En este documento, aprenderás a modificar tu app para iOS para que sea compatible con App Flip.

Prueba la muestra

La app de ejemplo Cambio de app demuestra una integración de vinculación de cuentas en iOS que es compatible con App Flip. Puedes usar esta app para verificar cómo responder a un cambio universal de app entrante de Google para dispositivos móviles.

La app de ejemplo está preconfigurada para integrarse con la herramienta de prueba de cambio de app para iOS, que puedes usar para verificar la integración de tu app de iOS con el cambio de app antes que configures la vinculación de cuentas con Google. Esta app simula el vínculo universal que las apps de Google para dispositivos móviles activan cuando se habilita el cambio de app.

Cómo funciona

A continuación, se muestran los pasos de flujo que siguen la app de Google y tu app cuando El cambio de app ocurre:

  1. La app de Google intenta abrir el vínculo universal de tu app. Puede abre tu app si está instalada en el dispositivo del usuario y asociada con el vínculo universal. Para obtener más información, consulta Compatibilidad con vínculos universales.

  2. Tu app verifica que los parámetros client_id y redirect_uri estén codificados. en la URL entrante coincida con el vínculo universal de Google esperado.

  3. Tu app solicita un código de autorización de tu servidor OAuth2. Al final de este flujo, la aplicación devuelve un código de autorización o un error al la app de Google. Para ello, abre el vínculo universal de Google con los parámetros del código de autorización o el error.

  4. La app de Google administra el vínculo universal de Google entrante y continúa con el resto del flujo. Si se proporciona un código de autorización, la vinculación completar de inmediato. El intercambio de tokens se realiza servidor a servidor, el mismo como lo hace en el flujo de vinculación de OAuth basado en el navegador. Si se muestra un código de error que se muestra, el flujo de vinculación continúa con las opciones alternativas.

Cómo modificar tu app para iOS para que admita el cambio de app

Para admitir el cambio de app, realiza los siguientes cambios de código en tu app para iOS:

  1. Controla NSUserActivityTypeBrowsingWeb en el delegado de la app.
  2. Captura los parámetros redirect_uri y state de la URL para usarlos más adelante.
  3. Verifica que redirect_uri coincida con este formato:
    https://oauth-redirect.googleusercontent.com/a/GOOGLE_APP_BUNDLE_ID
    https://oauth-redirect-sandbox.googleusercontent.com/a/GOOGLE_APP_BUNDLE_ID
  4. Verifica que el ID de cliente coincida con el valor esperado. Usa los siguientes muestra de código:

    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. Cuando la autorización se haya realizado correctamente, llama al URI de redireccionamiento con la autorización código. Usa la siguiente muestra de código:

    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. Si se produjo un error, adjunta el resultado del error al URI de redireccionamiento. Usa la siguiente muestra de código:

    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)
        }
    }
    

Cuando se abre con la app de Google, el vínculo universal de la app incluye lo siguiente parámetros de consulta:

  • client_id (String): Es el client_id de Google registrado en tu app.
  • scope (List of String): Una lista de permisos separados por espacios solicitados.
  • state (String): Un nonce que usa Google para verificar que la autorización resultado es en respuesta a una solicitud saliente de Google.
  • redirect_uri (String): El vínculo universal de Google. El "volteo" URI para abrir la app de Google y pasar los resultados.

Parámetros que se usan cuando el resultado de la autorización se muestra correctamente:

  • code (String): Es el valor del código de autorización, si está disponible.
  • state (String): Es el valor exacto recibido del vínculo universal entrante.

Parámetros que se usan cuando el resultado de la autorización se muestra sin éxito:

  • error (String), con los siguientes valores:

    • cancelled: Es un error recuperable. La app de Google intentará acceder a la cuenta la vinculación con la URL de autorización. Algunos ejemplos son cuando el usuario para acceder, si un dispositivo se queda sin conexión o se agota el tiempo de espera de la conexión.
    • unrecoverable: Es un error irrecuperable. Por ejemplo, el usuario intenta vincularse con una cuenta inhabilitada.La app de Google anulará la vinculación de cuentas.
    • invalid_request: Los parámetros de la solicitud no son válidos o no se encuentran. Este es un error recuperable. La app de Google intentará vincular las cuentas con la URL de autorización.
    • access_denied: El usuario rechaza la solicitud de consentimiento. Este es un error irrecuperable. Google app anula la vinculación.
  • error_description (String, opcional): Es un mensaje de error fácil de usar.

Para todos los tipos de errores, debes devolver los datos de respuesta al valor especificado REDIRECT_URI para garantizar que se active el resguardo adecuado.

Modifica tu extremo de autorización para admitir el cambio de app

Configura tu plataforma para que acepte solicitudes usando las URLs de redireccionamiento de cambio de app de Google:

  • App de 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
    
  • App del Asistente de 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
    

Verifica que client_id y la URL que especifica el parámetro redirect_uri coinciden con los valores esperados cuando se recibe una solicitud. si la verificación del cliente falla, muestra el error invalid_request a redirect_uri.