iOS用アプリフリップ

OAuthベースのアプリフリップリンク(App Flip)は、GoogleアプリからiOSアプリを開き、Googleアプリユーザーが自分のアカウントをより簡単にリンクできるようにします。この機能を実装するには、iOSアプリにマイナーなコード変更を加える必要があります。

このドキュメントでは、AppFlipをサポートするようにiOSアプリを変更する方法を学習します。

サンプルをお試しください

アプリのフリップサンプルアプリケーションは、アプリケーションフリップ互換性のiOSの統合をリンクするアカウントを示しています。このアプリを使用して、Googleモバイルアプリからの着信AppFlipユニバーサルリンクに応答する方法を確認できます。

サンプルアプリはと統合するために事前に設定され、iOS向けアプリのフリップテストツールあなたが設定しグーグルとの連携を占める前に、アプリのフリップであなたのiOSアプリの統合を確認するために使用することができ、。このアプリは、AppFlipが有効になっているときにGoogleモバイルアプリによってトリガーされるユニバーサルリンクをシミュレートします。

使い方

アプリフリップが発生したときにGoogleアプリとアプリが実行するフロー手順は次のとおりです。

  1. Googleアプリは、アプリのユニバーサルリンクを開こうとします。アプリがユーザーのデバイスにインストールされ、ユニバーサルリンクに関連付けられている場合、アプリを開くことができます。参照ユニバーサルリンクをサポート詳細については。

  2. アプリの確認client_idredirect_uri入ってくるURLにエンコードされたパラメータが期待されるGoogleのユニバーサルリンクに一致します。

  3. アプリがOAuth2サーバーに認証コードを要求します。このフローの最後に、アプリは認証コードまたはエラーのいずれかをGoogleアプリに返します。これを行うために、認証コードまたはエラーのパラメータが追加されたGoogleのユニバーサルリンクを開きます。

  4. Googleアプリは、着信するGoogleユニバーサルリンクを処理し、残りのフローを続行します。認証コードが提供されている場合、リンクはすぐに完了します。トークン交換は、ブラウザベースのOAuthリンクフローで行うのと同じ方法で、サーバー間で行われます。エラーコードが返された場合、リンクフローは代替オプションを使用して続行されます。

アプリフリップをサポートするようにiOSアプリを変更します

App Flipをサポートするには、iOSアプリに次のコード変更を加えます。

  1. ハンドルNSUserActivityTypeBrowsingWebあなたのアプリケーションのデリゲートに。
  2. キャプチャredirect_uristate 、後に使用する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. クライアントIDが期待値と一致することを確認します。次のコードサンプルを使用します。

    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_idString ):Googleがclient_idのアプリの下に登録されているのを。
  • scopeList of String ):スペースで区切られたスコープのリスト要請しました。
  • stateString ):認証結果は、Googleの発信要求に応答することを確認するためにGoogleが使用ナンス。
  • redirect_uriString ):Googleのユニバーサルリンク。 Googleアプリを開いて結果を渡すための「フリップ」URI。

許可結果が正常に返されるときに使用されるパラメーター:

  • codeString ):認証コードの値が、利用可能な場合。
  • stateString ):着信ユニバーサル・リンクから受信した正確な値。

許可結果が正常に返されない場合に使用されるパラメーター:

  • errorString )、以下の値を持ちます。

    • cancelled :回復可能なエラー。 Googleアプリは、認証URLを使用してアカウントのリンクを試みます。たとえば、ユーザーがサインインに失敗したり、デバイスがオフラインになったり、接続がタイムアウトしたりします。
    • unrecoverable :エラー。たとえば、ユーザーが無効になっているアカウントにリンクしようとすると、Googleアプリはアカウントのリンクを中止します。
    • invalid_request :リクエストパラメータが無効であるか、不足しています。これは回復可能なエラーです。 Googleアプリは、認証URLを使用してアカウントのリンクを試みます。
    • access_denied :ユーザーが同意要求を拒否します。これは回復不可能なエラーです。 Googleアプリはリンクを中止します。
  • error_descriptionString 、オプション):ユーザーフレンドリーなエラーメッセージ。

AppFlipをサポートするように認証エンドポイントを変更します

GoogleのAppFlipリダイレクトURLを使用してリクエストを受け入れるようにプラットフォームを構成します。

  • Googleホームアプリ
    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要求を受信したときにパラメータが期待値と一致します。