Virar aplicativo para iOS

A vinculação de app baseado em OAuth (App Flip) abre seu app iOS em um app do Google para ajudar o usuário do Google app a vincular a conta com mais facilidade. Você precisa fazer pequenas alterações no código do seu aplicativo iOS para implementar esse recurso.

Neste documento, você vai aprender a modificar seu app iOS para que ele seja compatível com o App Flip.

Testar o exemplo

App de exemplo App Flip demonstra uma integração de vinculação de contas no iOS compatível com o App Flip. Você pode usar este app para verificar como responder a um App Flip universal recebido dos apps para dispositivos móveis do Google.

O app de exemplo está pré-configurado para integração com a App Flip Test Tool para iOS que você pode usar para verificar a integração do seu app iOS com o App Flip antes você configura a vinculação de contas com o Google. Este app simula o link universal acionada pelos apps para dispositivos móveis do Google quando o App Flip está ativado.

Como funciona

Confira a seguir as etapas de fluxo que o Google app e seu app seguem ao A virada de app ocorre:

  1. O Google app tenta abrir o link universal do seu app. Ele é capaz de abrem o app se ele estiver instalado no dispositivo do usuário e associado a o link universal. Consulte Suporte a links universais para ver mais detalhes.

  2. O app verifica se os parâmetros client_id e redirect_uri estão codificados no URL de entrada corresponde ao link universal esperado do Google.

  3. O app solicita um código de autorização do servidor OAuth2. No fim desse fluxo, seu aplicativo retorna um código de autorização ou um erro para Google app. Para isso, ele abre o link universal do Google com anexos para o código de autorização ou erro.

  4. O Google app processa o link universal recebido do Google e continua com o restante do fluxo. Se um código de autorização for fornecido, a vinculação será concluído imediatamente. A troca de tokens ocorre de servidor para servidor, no fluxo de vinculação do OAuth baseado no navegador. Se um código de erro for for retornado, o fluxo de vinculação continuará com as opções alternativas.

Modificar seu app iOS para oferecer suporte ao App Flip

Para oferecer suporte ao App Flip, faça as seguintes alterações de código no seu app iOS:

  1. Gerencie o NSUserActivityTypeBrowsingWeb no delegado do app.
  2. Capture os parâmetros redirect_uri e state do URL para usar depois.
  3. Verifique se redirect_uri corresponde a este formato:
    https://oauth-redirect.googleusercontent.com/a/GOOGLE_APP_BUNDLE_ID
    https://oauth-redirect-sandbox.googleusercontent.com/a/GOOGLE_APP_BUNDLE_ID
  4. Verifique se o ID do cliente corresponde ao valor esperado. Use o seguinte exemplo 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. Após a autorização, chame o URI de redirecionamento com a autorização o código-fonte. Use o exemplo de código a seguir:

    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. Se ocorrer um erro, anexe um resultado de erro ao URI de redirecionamento. Use o exemplo de código a seguir:

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

Quando aberto pelo Google app, o link universal do seu app inclui o seguinte: parâmetros de consulta:

  • client_id (String): Google client_id que está registrado no app.
  • scope (List of String): uma lista de escopos separados por espaços solicitados.
  • state (String): um valor de uso único usado pelo Google para verificar se a autorização resultado é uma resposta à solicitação enviada pelo Google.
  • redirect_uri (String): link universal do Google. A "virada" URI a ser aberto o Google app e transmitir os resultados.

Parâmetros usados quando o resultado da autorização é retornado com sucesso:

  • code (String): o valor do código de autorização, se disponível.
  • state (String): o valor exato recebido do link universal recebido.

Parâmetros usados quando o resultado da autorização é retornado com falha:

  • error (String), com os seguintes valores:

    • cancelled: um erro recuperável. O Google app tentará usando o URL de autorização. Alguns exemplos são os casos de para fazer login, quando um dispositivo está off-line ou o tempo limite de uma conexão se esgotou.
    • unrecoverable: um erro irrecuperável. Por exemplo, o usuário tenta vincular com uma conta desativada.O Google app vai cancelar a vinculação da conta.
    • invalid_request: os parâmetros da solicitação são inválidos ou estão ausentes. Este é um erro recuperável. O Google app tentará vincular a conta usando o URL de autorização.
    • access_denied: o usuário recusa a solicitação de consentimento. Este é um erro não recuperável; o Google app cancela a vinculação.
  • error_description (String, opcional): é uma mensagem de erro fácil de usar.

Para todos os tipos de erro, você deve retornar os dados de resposta para o método REDIRECT_URI para garantir que o substituto apropriado seja acionado.

Modifique seu endpoint de autorização para oferecer suporte ao App Flip

Configure sua plataforma para aceitar solicitações usando os URLs de redirecionamento do App Flip do Google:

  • App 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 Google Assistente
    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
    

Verifique se client_id e o URL especificado pelo parâmetro redirect_uri correspondem aos valores esperados quando uma solicitação é recebida. se a verificação do cliente falhar, retorne o erro invalid_request ao redirect_uri.