Tetap teratur dengan koleksi
Simpan dan kategorikan konten berdasarkan preferensi Anda.
Penautan Balik Aplikasi berbasis OAuth (App Flip) membuka aplikasi iOS Anda dari aplikasi Google
untuk memudahkan pengguna aplikasi Google
menautkan akun mereka. Anda perlu membuat
sedikit perubahan kode pada aplikasi iOS untuk menerapkan fitur ini.
Dalam dokumen ini, Anda akan mempelajari cara memodifikasi aplikasi iOS untuk mendukung App Flip.
Coba sampel
Aplikasi contoh App Flip
menunjukkan integrasi penautan akun di iOS yang kompatibel dengan App Flip.
Anda dapat menggunakan aplikasi ini untuk memverifikasi cara merespons aplikasi universal Flip Aplikasi yang masuk
tautan dari aplikasi seluler Google.
Aplikasi contoh telah dikonfigurasi sebelumnya untuk berintegrasi dengan Alat Pengujian Balik Aplikasi untuk
iOS,
yang dapat Anda gunakan untuk memverifikasi
integrasi aplikasi iOS dengan App Flip sebelum
Anda mengonfigurasi penautan akun dengan Google. Aplikasi ini menyimulasikan link universal
dipicu oleh aplikasi seluler Google
saat Membalik Aplikasi diaktifkan.
Cara kerjanya
Berikut ini adalah langkah-langkah alur yang diambil aplikasi Google dan aplikasi Anda saat
Pembalikan Aplikasi terjadi:
Aplikasi Google akan mencoba membuka link universal aplikasi Anda. Aplikasi ini mampu
membuka aplikasi Anda jika diinstal pada perangkat pengguna dan dikaitkan dengan
tautan universal. Lihat Mendukung Link Universal untuk mengetahui detailnya.
Aplikasi Anda memeriksa apakah parameter client_id dan redirect_uri dienkode
di URL yang masuk cocok dengan
tautan universal Google yang diharapkan.
Aplikasi Anda meminta kode otorisasi dari server OAuth2 Anda. Di bagian akhir
alur ini, aplikasi Anda mengembalikan kode otorisasi atau kesalahan ke
aplikasi Google. Untuk melakukannya, ia membuka tautan
universal Google dengan tanda
untuk kode otorisasi atau error.
Aplikasi Google menangani tautan universal Google yang masuk dan melanjutkan dengan
untuk seluruh
alurnya. Jika kode otorisasi diberikan, penautannya akan
langsung diselesaikan. Pertukaran token terjadi secara
server ke server, proses yang sama
seperti dalam alur penautan OAuth berbasis browser. Jika kode error adalah
dikembalikan, alur penautan berlanjut dengan opsi alternatif.
Memodifikasi aplikasi iOS Anda untuk mendukung App Flip
Untuk mendukung App Flip, buat perubahan kode berikut pada aplikasi iOS Anda:
Tangani NSUserActivityTypeBrowsingWeb di Delegasi Aplikasi Anda.
Ambil parameter redirect_uri dan state dari URL untuk digunakan nanti.
Setelah otorisasi berhasil, panggil URI pengalihan dengan otorisasi
pada kode sumber. Gunakan contoh kode berikut:
funcreturnAuthCode(code:String,state:String,redirectUri:String){varredirectURL=URL(string:redirectUri)varcomponents=URLComponents(url:redirectURL,resolvingAgainstBaseURL:false)// Return the authorization code and original stateletparamAuthCode=URLQueryItem(name:"code",value:code)letparamState=URLQueryItem(name:"state",value:state)components?.queryItems=[paramAuthCode,paramState]ifletresultURL=components?.url{UIApplication.shared.open(resultURL,options:[UIApplicationOpenURLOptionUniversalLinksOnly:true],completionHandler:nil)}}
Jika terjadi error, lampirkan hasil error ke URI pengalihan.
Gunakan contoh kode berikut:
funcreturnError(redirectUri:String){varredirectURL=URL(string:redirectUri)varcomponents=URLComponents(url:redirectURL,resolvingAgainstBaseURL:false)// Return the authorization code and original stateletparamError=URLQueryItem(name:"error",value:"invalid_request")letparamDescription=URLQueryItem(name:"error_description",value:"Invalid Request")components?.queryItems=[paramError,paramDescription]ifletresultURL=components?.url{UIApplication.shared.open(resultURL,options:[UIApplicationOpenURLOptionUniversalLinksOnly:true],completionHandler:nil)}}
Parameter kueri untuk link universal aplikasi Anda
Saat dibuka oleh aplikasi Google, link universal aplikasi Anda mencakup hal berikut
parameter kueri:
client_id (String): Google client_id yang terdaftar di aplikasi Anda.
scope (List of String): Daftar cakupan yang dipisahkan spasi yang diminta.
state (String): Nonce yang digunakan oleh Google untuk memverifikasi bahwa otorisasi
hasilnya adalah respons terhadap permintaan keluar Google.
redirect_uri (String): Link universal Google. "Balik" URI yang akan dibuka
aplikasi Google dan
meneruskan hasil.
Parameter kueri untuk link universal Google
Parameter yang digunakan saat hasil otorisasi berhasil ditampilkan:
code (String): Nilai kode otorisasi, jika tersedia.
state (String): Nilai tepat yang diterima dari link universal yang masuk.
Parameter yang digunakan saat hasil otorisasi tidak berhasil ditampilkan:
error (String), dengan nilai berikut:
cancelled: Error yang dapat dipulihkan. Aplikasi Google akan mencoba akun
penautan menggunakan URL otorisasi. Beberapa contohnya adalah
kegagalan pengguna
untuk masuk, perangkat sedang offline, atau waktu koneksi habis.
unrecoverable: Error yang tidak dapat dipulihkan. Misalnya, pengguna mencoba menautkan dengan akun yang dinonaktifkan.Aplikasi Google akan membatalkan penautan akun.
invalid_request: Parameter permintaan tidak valid atau tidak ada. Ini adalah error yang dapat dipulihkan. Aplikasi Google akan mencoba melakukan penautan akun menggunakan URL otorisasi.
access_denied: Pengguna menolak permintaan izin. Ini adalah error yang tidak dapat dipulihkan; aplikasi Google membatalkan penautan.
error_description (String, opsional): Pesan error yang mudah digunakan.
Untuk semua jenis error, Anda harus menampilkan data respons ke string yang ditentukan
REDIRECT_URI untuk memastikan penggantian yang tepat lebih diprioritaskan.
Mengubah endpoint otorisasi untuk mendukung App Flip
Konfigurasi platform Anda untuk menerima permintaan menggunakan URL alihan App Flip Google:
Pastikan client_id dan URL yang ditentukan oleh parameter redirect_uri
mencocokkan nilai yang diharapkan saat permintaan diterima. jika verifikasi klien
gagal, tampilkan error invalid_request ke redirect_uri.
[null,null,["Terakhir diperbarui pada 2025-07-25 UTC."],[[["\u003cp\u003eOAuth-based App Flip linking simplifies account linking for Google app users by enabling them to seamlessly open your iOS app for authorization.\u003c/p\u003e\n"],["\u003cp\u003eTo support App Flip, you need to modify your iOS app to handle universal links, validate incoming parameters, and return authorization codes or errors to the Google app.\u003c/p\u003e\n"],["\u003cp\u003eYour authorization endpoint must be configured to accept Google's App Flip redirect URLs and perform client verification for incoming requests.\u003c/p\u003e\n"],["\u003cp\u003eThe App Flip sample app and test tool provide a practical demonstration and verification environment for your iOS app's integration with App Flip.\u003c/p\u003e\n"]]],[],null,["# App Flip for iOS\n\nOAuth-based App Flip linking (App Flip) opens your iOS app from a Google app\nto help the Google app user link their account more easily. You need to make\nminor code changes to your iOS app to implement this feature.\n\nIn this document, you learn how to modify your iOS app to support App Flip.\n\n### Try the sample\n\nThe App Flip [sample app](https://github.com/googlesamples/identity-appflip-ios)\ndemonstrates an account linking integration on iOS that's App Flip-compatible.\nYou can use this app to verify how to respond to an incoming App Flip universal\nlink from Google mobile apps.\n\nThe sample app is preconfigured to integrate with the [App Flip Test Tool for\niOS](https://github.com/googlesamples/identity-appflip-tester-ios),\nwhich you can use to verify your iOS app's integration with App Flip before\nyou configure account linking with Google. This app simulates the universal link\ntriggered by Google mobile apps when App Flip is enabled.\n\n### How it works\n\nThe following are the flow steps that the Google app and your app take when\nApp Flip occurs:\n\n1. The Google app attempts to open your app's universal link. It's able to\n open your app if it's installed on the user's device and associated with\n the universal link. See [Supporting Universal Links](https://developer.apple.com/documentation/uikit/inter-process_communication/allowing_apps_and_websites_to_link_to_your_content) for details.\n\n2. Your app checks that the `client_id` and `redirect_uri` parameter encoded\n in the incoming URL matches the expected Google universal link.\n\n3. Your app requests an authorization code from your OAuth2 server. At the end\n of this flow, your app returns either an authorization code or an error to\n the Google app. To do this, it opens Google's universal link with appended\n parameters for the authorization code or error.\n\n4. The Google app handles the incoming Google universal link and continues with\n the rest of the flow. If an authorization code is provided, the linking is\n completed immediately. The token exchange happens server-to-server, the same\n way it does in the browser-based OAuth linking flow. If an error code is\n returned, the linking flow continues with the alternative options.\n\n### Modify your iOS app to support App Flip\n\nTo support App Flip, make the following code changes to your iOS app:\n\n1. Handle `NSUserActivityTypeBrowsingWeb` in your App Delegate.\n2. Capture `redirect_uri` and `state` parameters from the URL to use later.\n3. Check that `redirect_uri` matches this format: \n\n ```\n https://oauth-redirect.googleusercontent.com/a/GOOGLE_APP_BUNDLE_ID\n https://oauth-redirect-sandbox.googleusercontent.com/a/GOOGLE_APP_BUNDLE_ID\n ```\n4. Verify that the client ID matches the expected value. Use the following\n code sample:\n\n func application(_ application: UIApplication,\n continue userActivity: NSUserActivity,\n restorationHandler: @escaping ([Any]?) -\u003e Void) -\u003e Bool\n {\n guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,\n let incomingURL = userActivity.webpageURL,\n let components = URLComponents(url: incomingURL, resolvingAgainstBaseURL: false),\n let params = components.queryItems else {\n return false\n }\n\n if let clientId = params.filter({$0.name == \"client_id\"}).first?.value,\n let state = params.filter({$0.name == \"state\"}).first?.value,\n let redirectUri = params.filter({$0.name == \"redirect_uri\"}).first?.value {\n\n // Save the redirect_uri and state for later...\n\n // Verify the client id\n return (clientId == GOOGLE_CLIENT_ID)\n } else {\n // Missing required parameters\n return false\n }\n }\n\n5. Upon successful authorization, call the redirect URI with the authorization\n code. Use the following code sample:\n\n func returnAuthCode(code: String, state: String, redirectUri: String) {\n var redirectURL = URL(string: redirectUri)\n var components = URLComponents(url: redirectURL, resolvingAgainstBaseURL: false)\n\n // Return the authorization code and original state\n let paramAuthCode = URLQueryItem(name: \"code\", value: code)\n let paramState = URLQueryItem(name: \"state\", value: state)\n components?.queryItems = [paramAuthCode, paramState]\n if let resultURL = components?.url {\n UIApplication.shared.open(\n resultURL,\n options: [UIApplicationOpenURLOptionUniversalLinksOnly : true],\n completionHandler: nil)\n }\n }\n\n6. If an error occurred, attach an error result to the redirect URI instead.\n Use the following code sample:\n\n **Note:** Do not handle the error directly within your app, instead return the error result to the `REDIRECT_URL`. This ensures that the appropriate fallback method is trigerred if the app linking flow fails. \n\n func returnError(redirectUri: String) {\n var redirectURL = URL(string: redirectUri)\n var components = URLComponents(url: redirectURL, resolvingAgainstBaseURL: false)\n\n // Return the authorization code and original state\n let paramError = URLQueryItem(name: \"error\", value: \"invalid_request\")\n let paramDescription = URLQueryItem(name: \"error_description\", value: \"Invalid Request\")\n components?.queryItems = [paramError, paramDescription]\n if let resultURL = components?.url {\n UIApplication.shared.open(\n resultURL,\n options: [UIApplicationOpenURLOptionUniversalLinksOnly : true],\n completionHandler: nil)\n }\n }\n\n### Query parameters for your app's universal link\n\nWhen opened by the Google app, your app's universal link includes the following\nquery parameters:\n\n- `client_id` (`String`): Google `client_id` that's registered under your app.\n- `scope` (`List of String`): A list of space-separated scopes requested.\n- `state` (`String`): A nonce used by Google to verify that the authorization result is in response to Google's outgoing request.\n- `redirect_uri` (`String`): Google's universal link. The \"flip\" URI to open the Google app and pass results.\n\n### Query parameters for Google's universal link\n\nParameters used when the authorization result is returned successfully:\n\n- `code` (`String`): The value of the authorization code, if available.\n- `state` (`String`): The exact value received from the incoming universal link.\n\nParameters used when the authorization result is returned unsuccessfully:\n\n- `error` (`String`), with the following values:\n\n - `cancelled`: A recoverable error. The Google app will attempt account linking using the authorization URL. Some examples are the user failing to sign in, a device being offline or a connection timing out.\n - `unrecoverable`: An unrecoverable error. For example, the user attempts to link with a disabled account.The Google app will abort account linking.\n - `invalid_request`: The request parameters are invalid or missing. This is a recoverable error. The Google app will attempt account linking using the authorization URL.\n - `access_denied`: The user rejects the consent request. This is a non-recoverable error; the Google app aborts linking.\n- `error_description` (`String`, optional): A user-friendly error message.\n\n | **Note:** For more information on [possible errors](https://www.oauth.com/oauth2-servers/server-side-apps/possible-errors/) and the optional contents of the `error_description` field, see the OAuth 2.0 standard.\n\nFor all error types, you must return the response data to the specified\n`REDIRECT_URI` to ensure the appropriate fallback is trigerred.\n\n### Modify your authorization endpoint to support App Flip\n\nConfigure your platform to accept requests using Google's App Flip redirect URLs:\n\n- Google Home app \n\n ```\n https://oauth-redirect.googleusercontent.com/a/com.google.Chromecast.dev\n https://oauth-redirect.googleusercontent.com/a/com.google.Chromecast.enterprise\n https://oauth-redirect.googleusercontent.com/a/com.google.Chromecast\n https://oauth-redirect-sandbox.googleusercontent.com/a/com.google.Chromecast.dev\n https://oauth-redirect-sandbox.googleusercontent.com/a/com.google.Chromecast.enterprise\n https://oauth-redirect-sandbox.googleusercontent.com/a/com.google.Chromecast\n ```\n- Google Assistant app \n\n ```\n https://oauth-redirect.googleusercontent.com/a/com.google.OPA.dev\n https://oauth-redirect.googleusercontent.com/a/com.google.OPA.enterprise\n https://oauth-redirect.googleusercontent.com/a/com.google.OPA\n https://oauth-redirect-sandbox.googleusercontent.com/a/com.google.OPA.dev\n https://oauth-redirect-sandbox.googleusercontent.com/a/com.google.OPA.enterprise\n https://oauth-redirect-sandbox.googleusercontent.com/a/com.google.OPA\n ```\n\nCheck that `client_id` and the URL specified by the `redirect_uri` parameter\nmatch the expected values when a request is received. if the client verification\nfails, return the error `invalid_request` to the `redirect_uri`."]]