App 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

Для поддержки App Flip внесите в приложение iOS следующие изменения кода:

  1. Обработайте NSUserActivityTypeBrowsingWeb в своем 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 : параметры запроса недействительны или отсутствуют.
  • error_description ( String , необязательно): удобное сообщение об ошибке.

Измените конечную точку авторизации для поддержки 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 Ассистент
    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 соответствуют ожидаемым значениям при получении запроса.