OAuthベースのアプリフリップリンク(App Flip)は、GoogleアプリからiOSアプリを開き、Googleアプリユーザーが自分のアカウントをより簡単にリンクできるようにします。この機能を実装するには、iOSアプリにマイナーなコード変更を加える必要があります。
このドキュメントでは、AppFlipをサポートするようにiOSアプリを変更する方法を学習します。
サンプルをお試しください
アプリのフリップサンプルアプリケーションは、アプリケーションフリップ互換性のiOSの統合をリンクするアカウントを示しています。このアプリを使用して、Googleモバイルアプリからの着信AppFlipユニバーサルリンクに応答する方法を確認できます。
サンプルアプリはと統合するために事前に設定され、iOS向けアプリのフリップテストツールあなたが設定しグーグルとの連携を占める前に、アプリのフリップであなたのiOSアプリの統合を確認するために使用することができ、。このアプリは、AppFlipが有効になっているときにGoogleモバイルアプリによってトリガーされるユニバーサルリンクをシミュレートします。
使い方
アプリフリップが発生したときにGoogleアプリとアプリが実行するフロー手順は次のとおりです。
Googleアプリは、アプリのユニバーサルリンクを開こうとします。アプリがユーザーのデバイスにインストールされ、ユニバーサルリンクに関連付けられている場合、アプリを開くことができます。参照ユニバーサルリンクをサポート詳細については。
アプリの確認
client_id
とredirect_uri
入ってくるURLにエンコードされたパラメータが期待されるGoogleのユニバーサルリンクに一致します。アプリがOAuth2サーバーに認証コードを要求します。このフローの最後に、アプリは認証コードまたはエラーのいずれかをGoogleアプリに返します。これを行うには、認証コードまたはエラーのパラメータが追加されたGoogleのユニバーサルリンクを開きます。
Googleアプリは、着信するGoogleユニバーサルリンクを処理し、残りのフローを続行します。認証コードが提供されている場合、リンクはすぐに完了します。トークン交換は、ブラウザベースのOAuthリンクフローで行われるのと同じ方法で、サーバー間で行われます。エラーコードが返された場合、リンクフローは代替オプションを使用して続行されます。
アプリフリップをサポートするようにiOSアプリを変更します
App Flipをサポートするには、iOSアプリに次のコード変更を加えます。
- ハンドル
NSUserActivityTypeBrowsingWeb
あなたのアプリケーションのデリゲートに。 - キャプチャ
redirect_uri
やstate
、後に使用するURLからパラメータを。 - チェックその
redirect_uri
この形式に一致します。https://oauth-redirect.googleusercontent.com/a/GOOGLE_APP_BUNDLE_ID https://oauth-redirect-sandbox.googleusercontent.com/a/GOOGLE_APP_BUNDLE_ID
クライアント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 } }
承認が成功したら、承認コードを使用してリダイレクト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) } }
エラーが発生した場合は、代わりにエラー結果をリダイレクト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アプリを開き、結果を渡します。
Googleのユニバーサルリンクのクエリパラメータ
許可結果が正常に返されるときに使用されるパラメーター:
-
code
(String
):認証コードの値が、利用可能な場合。 -
state
(String
):着信ユニバーサル・リンクから受信した正確な値。
許可結果が正常に返されない場合に使用されるパラメーター:
error
(String
)、以下の値を持ちます。-
cancelled
:回復可能なエラー。 Googleアプリは、認証URLを使用してアカウントのリンクを試みます。たとえば、ユーザーがサインインに失敗したり、デバイスがオフラインになったり、接続がタイムアウトしたりします。 -
unrecoverable
:エラー。たとえば、ユーザーが無効になっているアカウントにリンクしようとすると、Googleアプリはアカウントのリンクを中止します。 -
invalid_request
:リクエストパラメータが無効であるか、不足しています。これは回復可能なエラーです。 Googleアプリは、認証URLを使用してアカウントのリンクを試みます。 -
access_denied
:ユーザーが同意要求を拒否します。これは回復不可能なエラーです。 Googleアプリはリンクを中止します。
-
error_description
(String
、オプション):ユーザーフレンドリーなエラーメッセージ。
すべてのエラー・タイプについては、指定した応答データを返す必要がありますREDIRECT_URI
適切なフォールバックがtrigerredされていることを確認します。
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
要求を受信したときにパラメータが期待値と一致します。クライアント検証が失敗した場合、エラーを返しinvalid_request
にredirect_uri
。