Koleksiyonlar ile düzeninizi koruyun
İçeriği tercihlerinize göre kaydedin ve kategorilere ayırın.
OAuth tabanlı App Flip bağlantısı (App Flip), bir Google uygulamasından iOS uygulamanızı açar
Böylece Google uygulaması kullanıcısının hesabını daha kolay bağlamasını sağlayabilirsiniz. Bağlantı kurmadan önce
bu özelliği uygulamak için iOS uygulamanızda küçük kod değişiklikleri yapın.
Bu dokümanda, iOS uygulamanızı App Flip'i destekleyecek şekilde nasıl değiştireceğinizi öğreneceksiniz.
Örneği dene
App Flip örnek uygulaması
, iOS'te App Flip ile uyumlu bir hesap bağlama entegrasyonunu gösterir.
Gelen bir App Flip evrensel öğesine nasıl yanıt vereceğinizi doğrulamak için bu uygulamayı kullanabilirsiniz
bağlantısını tıklayın.
Örnek uygulama, App Flip Test Tool ile entegrasyon için önceden yapılandırılmıştır.
iOS,
Bunu yapmadan önce iOS uygulamanızın App Flip ile entegrasyonunu doğrulamak için kullanabilirsiniz.
Google ile hesap bağlamayı yapılandırırsınız. Bu uygulama, geçiş bağlantısını simüle eder
Uygulama Döndürme etkinken Google mobil uygulamaları tarafından tetiklenir.
İşleyiş şekli
Aşağıda, Google uygulamasının ve uygulamanızın
Uygulama Döndürme şu şekilde gerçekleşir:
Google uygulaması, uygulamanızın evrensel bağlantısını açmaya çalışır. Şunları yapabilir:
Kullanıcının cihazında yüklüyse ve
evrensel bağlantı. Ayrıntılar için Geçiş Bağlantılarını Destekleme başlıklı makaleyi inceleyin.
Uygulamanız, client_id ve redirect_uri parametresinin kodlanıp kodlanmadığını kontrol eder
değeri, beklenen Google evrensel bağlantısıyla eşleşir.
Uygulamanız, OAuth2 sunucunuzdan bir yetkilendirme kodu istiyor. Sonda
uygulamanız, bu akıştan sonra bir yetkilendirme kodu veya
hata mesajı döndürerek
Google uygulaması. Bunu yapmak için, Google'ın evrensel bağlantısını
parametrelerini girmeniz gerekir.
Google uygulaması gelen Google evrensel bağlantısını işler ve
bu sürecin geri kalanında devam eder. Yetkilendirme kodu sağlanırsa bağlantı
tamamlanmaz. Jeton değişimi, sunucudan sunucuya aynı şekilde gerçekleşir.
aynı şekilde yapılandırmalısınız. Hata kodu
bağlantı akışı alternatif seçeneklerle devam eder.
iOS uygulamanızda App Flip'i destekleyecek şekilde değişiklik yapın
App Flip'i desteklemek için iOS uygulamanızda aşağıdaki kod değişikliklerini yapın:
Uygulama Yetkinizde NSUserActivityTypeBrowsingWeb için işlem yapın.
Daha sonra kullanmak üzere URL'den redirect_uri ve state parametrelerini alın.
redirect_uri etiketinin şu biçimle eşleştiğinden emin olun:
Başarılı yetkilendirmeden sonra yetkilendirme ile yönlendirme URI'sini çağırın
girin. Aşağıdaki kod örneğini kullanın:
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)}}
Bir hata oluşursa bunun yerine yönlendirme URI'sine bir hata sonucu ekleyin.
Aşağıdaki kod örneğini kullanın:
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)}}
Uygulamanızın evrensel bağlantısı için sorgu parametreleri
Google uygulaması tarafından açıldığında uygulamanızın evrensel bağlantısı şunları içerir:
sorgu parametreleri:
client_id (String): Uygulamanızda kayıtlı Google client_id.
scope (List of String): Boşlukla ayrılmış kapsamların listesi istendi.
state (String): Google'ın, yetkilendirmeyi doğrulamak için kullandığı tek seferlik rastgele sayı
Google'ın giden isteğine yanıt vermesi gerekir.
redirect_uri (String): Google'ın evrensel bağlantısı. "Katlama" Açılacak URI
Google uygulaması ve geçiş sonuçları.
Google evrensel bağlantısı için sorgu parametreleri
Yetkilendirme sonucu başarıyla döndürüldüğünde kullanılan parametreler:
state (String): Gelen evrensel bağlantıdan alınan tam değer.
Yetkilendirme sonucu başarısız bir şekilde döndürüldüğünde kullanılan parametreler:
Aşağıdaki değerlere sahip error (String):
cancelled: Kurtarılabilir bir hata. Google uygulaması, hesabı kullanmayı deneyecek
bağlama işlemini yapıyor. Örneğin, kullanıcının
veya bağlantının zaman aşımına uğraması gibi sorunları giderebilirsiniz.
unrecoverable: Kurtarılamayan bir hata. Örneğin, kullanıcı, devre dışı bırakılmış bir hesapla bağlantı kurmaya çalışır.Google uygulaması, hesap bağlama işlemini iptal eder.
invalid_request: İstek parametreleri geçersiz veya eksik. Bu hata kurtarılabilir. Google uygulaması, yetkilendirme URL'sini kullanarak hesap bağlamayı dener.
access_denied: Kullanıcı, izin isteğini reddeder. Bu, düzeltilemeyen bir hatadır; Google uygulaması, bağlantıyı iptal ediyor.
error_description (String, isteğe bağlı): Kullanıcı dostu bir hata mesajı.
Tüm hata türleri için yanıt verilerini belirtilen
Uygun yedeğin tetiklendiğinden emin olmak için REDIRECT_URI.
Yetkilendirme uç noktanızı App Flip'i destekleyecek şekilde değiştirin
Platformunuzu, Google'ın App Flip yönlendirme URL'lerini kullanarak istekleri kabul edecek şekilde yapılandırın:
client_id ve redirect_uri parametresi tarafından belirtilen URL'yi kontrol edin
ve bir istek alındığında beklenen değerlerle eşleşir. müşteri doğrulaması
başarısız olursa invalid_request hatasını redirect_uri öğesine döndürün.
[[["Anlaması kolay","easyToUnderstand","thumb-up"],["Sorunumu çözdü","solvedMyProblem","thumb-up"],["Diğer","otherUp","thumb-up"]],[["İhtiyacım olan bilgiler yok","missingTheInformationINeed","thumb-down"],["Çok karmaşık / çok fazla adım var","tooComplicatedTooManySteps","thumb-down"],["Güncel değil","outOfDate","thumb-down"],["Çeviri sorunu","translationIssue","thumb-down"],["Örnek veya kod sorunu","samplesCodeIssue","thumb-down"],["Diğer","otherDown","thumb-down"]],["Son güncelleme tarihi: 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`."]]