Zadbaj o dobrą organizację dzięki kolekcji
Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.
Otwieranie aplikacji na iOS z poziomu aplikacji Google za pomocą protokołu OAuth
, aby ułatwić użytkownikowi aplikacji Google połączenie konta. Musisz
wprowadzić drobne zmiany w kodzie aplikacji na iOS, aby wdrożyć tę funkcję.
Z tego dokumentu dowiesz się, jak zmodyfikować aplikację na iOS, aby obsługiwała App Flip.
Zobacz fragment
Przykładowa aplikacja App Flip
przedstawia integrację kont na iOS zgodną z funkcją App Flip.
Możesz użyć tej aplikacji, by sprawdzić, jak zareagować na przychodzącą uniwersalną przemianę aplikacji
w aplikacjach mobilnych Google.
Przykładowa aplikacja jest wstępnie skonfigurowana do integracji z App Flip Test Tool
iOS
Możesz go użyć do sprawdzenia integracji aplikacji na iOS z App Flip.
skonfigurować łączenie kont z Google. Ta aplikacja symuluje uniwersalny link
uruchamianych przez aplikacje mobilne Google, gdy włączone jest przewracanie aplikacji.
Jak to działa
Poniżej znajdziesz opis czynności, które wykonuje aplikacja Google i Twoja aplikacja, gdy
Odwracanie aplikacji:
Aplikacja Google próbuje otworzyć uniwersalny link aplikacji. Jest w stanie
otworzyć Twoją aplikację, jeśli jest zainstalowana na urządzeniu użytkownika i powiązana z
czyli uniwersalnego linku. Szczegółowe informacje znajdziesz w artykule Obsługa linków uniwersalnych.
Aplikacja sprawdza, czy parametry client_id i redirect_uri zostały zakodowane
w przychodzącym adresie URL pasuje do oczekiwanego uniwersalnego linku Google.
Aplikacja żąda kodu autoryzacji od serwera OAuth2. Na koniec
aplikacji zwraca kod autoryzacji lub błąd,
w aplikacji Google. Aby to zrobić, otwiera uniwersalny link Google z dołączonym rozszerzeniem
dla kodu autoryzacji lub parametrów błędu.
Aplikacja Google obsługuje przychodzący uniwersalny link Google i kontynuuje
reszta procesu. Jeśli podasz kod autoryzacji, połączenie będzie
możesz go przeprowadzić natychmiast. Wymiana tokenów odbywa się między serwerami, tak samo jak
tak samo jak w procesie łączenia z protokołem OAuth w przeglądarce. Jeśli kod błędu to
, połączenie kont będzie kontynuowane z wykorzystaniem alternatywnych opcji.
Zmodyfikuj aplikację na iOS, aby obsługiwała App Flip
Aby umożliwić obsługę App Flip, wprowadź te zmiany w kodzie aplikacji na iOS:
Obsłuż NSUserActivityTypeBrowsingWeb w planie przedstawiciela aplikacji.
Przechwyć z adresu URL parametry redirect_uri i state, aby użyć ich później.
Sprawdź, czy pole redirect_uri pasuje do tego formatu:
Po autoryzacji wywołaj identyfikator URI przekierowania z autoryzacją
w kodzie. Użyj tego przykładowego kodu:
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)}}
Jeśli wystąpił błąd, dołącz wynik błędu do identyfikatora URI przekierowania.
Użyj tego przykładowego kodu:
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)}}
Parametry zapytania dotyczące uniwersalnego linku Twojej aplikacji
Gdy aplikacja zostanie otwarta w aplikacji Google, jej uniwersalny link będzie zawierał te elementy:
parametry zapytania:
client_id (String): client_id Google zarejestrowane w Twojej aplikacji.
scope (List of String): lista żądanych zakresów oddzielonych spacjami.
state (String): liczba jednorazowa używana przez Google do zweryfikowania, czy autoryzacja
jest w odpowiedzi na żądanie Google
redirect_uri (String): uniwersalny link Google. „Odwróć” Identyfikator URI do otwarcia
aplikację Google i przekazywać wyniki.
Parametry zapytania uniwersalnego linku Google
Parametry używane po zwróceniu wyniku autoryzacji:
code (String): wartość kodu autoryzacji, jeśli jest dostępny.
state (String): dokładna wartość otrzymana z przychodzącego uniwersalnego linku.
Parametry używane, gdy wynik autoryzacji nie zostanie zwrócony:
error (String) z tymi wartościami:
cancelled: błąd, który można naprawić. Aplikacja Google spróbuje zalogować się na konto
przy użyciu adresu URL autoryzacji. Oto kilka przykładów: błąd użytkownika
logowania, urządzenie jest offline lub przekroczono limit czasu połączenia.
unrecoverable: błąd nieodwracalny. Na przykład użytkownik spróbuje utworzyć połączenie z wyłączonym kontem.Aplikacja Google przerwie łączenie kont.
invalid_request: parametry żądania są nieprawidłowe lub ich brak. Ten błąd można naprawić. Aplikacja Google spróbuje połączyć konto przy użyciu adresu URL autoryzacji.
access_denied: użytkownik odrzuca prośbę o zgodę na wykorzystanie danych. Tego błędu nie można naprawić. aplikacja Google przerwie łączenie.
error_description (String, opcjonalnie): wyświetlany komunikat o błędzie, który wyświetla się łatwo dla użytkownika.
W przypadku wszystkich typów błędów musisz zwrócić dane odpowiedzi do określonego typu
REDIRECT_URI, aby zapewnić uruchomienie odpowiedniej kreacji zastępczej.
Modyfikowanie punktu końcowego autoryzacji na potrzeby obsługi funkcji App Flip
Skonfiguruj platformę tak, aby akceptowała żądania za pomocą adresów URL przekierowania App Flip:
Sprawdź, czy client_id oraz adres URL określony przez parametr redirect_uri
są zgodne z oczekiwanymi wartościami po otrzymaniu żądania. jeśli weryfikacja klienta
nie powiedzie się, zwrócenie błędu invalid_request do funkcji redirect_uri.
[[["Łatwo zrozumieć","easyToUnderstand","thumb-up"],["Rozwiązało to mój problem","solvedMyProblem","thumb-up"],["Inne","otherUp","thumb-up"]],[["Brak potrzebnych mi informacji","missingTheInformationINeed","thumb-down"],["Zbyt skomplikowane / zbyt wiele czynności do wykonania","tooComplicatedTooManySteps","thumb-down"],["Nieaktualne treści","outOfDate","thumb-down"],["Problem z tłumaczeniem","translationIssue","thumb-down"],["Problem z przykładami/kodem","samplesCodeIssue","thumb-down"],["Inne","otherDown","thumb-down"]],["Ostatnia aktualizacja: 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`."]]