diff --git a/documentation/migration-guide-2.0.0.md b/documentation/migration-guide-2.0.0.md new file mode 100644 index 0000000..b4a64ea --- /dev/null +++ b/documentation/migration-guide-2.0.0.md @@ -0,0 +1,171 @@ +# Uber iOS SDK 2.0.0 - Migration Guide +The Uber Rides SDK has been revamped and renamed to the Uber iOS SDK. Among other things, this new release includes a simplified API, better security for mobile OAuth, and updated platform support. + +There are a few breaking changes that must be handled when updating the SDK. This guide will help you navigate the major code changes necessary to make the upgrade. + +## New + Updated Features +### Swift Package Manager Support +Swift Package Manager is now the preferred way to integrate the Uber iOS SDK. Support for other third party package managers has been dropped for this release. + +### Improved API +Authenticating with Uber has now been moved behind a simplified API. Now, less setup and state management is required from the caller. + +### Auth Code Grant Flow + PKCE +The Authorization Code Grant Flow is now the default method for requesting auth credentials. In addition, support for PKCE and client access token exchange has been added. + +Support for the Implicit Grand Flow has been removed. + +### Prefill User Information +A convenient growth feature has been added for in app authentication. Supply optional user information to be prefilled on the signup + login page when asking the user to authenticate. + +### Sample App Improvements +A brand new [sample app](../examples/UberSDK/README.md) has been provided. Use it as a playground to test your app's functionality. + +## Migrating from 0.1x + +### Info.plist Keys +The keys used to identify your app's credentials have changed in this release. + +Previously, top-level `UberClientID` and `UberDisplayName` keys were used. +``` +UberClientID +[ClientID] +UberServerToken +[Server Token] +UberDisplayName +[App Name] +LSApplicationQueriesSchemes + + uber + uberauth + +``` + +These keys have been moved under a parent `Uber` key. + + +Note that `LSApplicationQueriesSchemes` remains top level, however: + +* UberClientID -> Uber/ClientID +* UberDisplayName -> Uber/DisplayName + + +``` +LSApplicationQueriesSchemes + + uber + uberauth + ubereats + uberdriver + +Uber + + ClientID + [Client ID] + DisplayName + [App Name] + +``` + + +### Authenticating + +Previously, to initiate auth, the LoginManager was accessed directly. This can no longer be done and auth must now be initiated using the `UberAuth.login` static method. + +Before: +``` +let requestedScopes = [UberScope.request, UberScope.allTrips] +let loginManager = LoginManager(...) + +loginManager.login( + requestedScopes: requestedScopes, + presentingViewController: self +) { (accessToken, error) -> () in + // Use access token or handle error +} +``` + +After: +``` +let context = AuthContext( + authDestination: authDestination, // .native or .inApp + authProvider: authProvider, // .authorizationCode + prefill: prefill +) + +UberAuth.login( + context: context, + completion: { result in + // Handle Result + } +) +``` + +### Response Types +The auth API no longer response directly with an access token. Now, the login response will come in the form of a Result type either containing a value of type `Client` or an error of type `UberAuthError`. + +The Client type contains the following properties: +| Property | Type | Description | +| ------------- | ------------- | ------------- | +| authorizationCode | String? | The authorization code received from the authorization server. If this property is non-nil, all other properties will be nil. | +| accessToken | String? | The access token issued by the authorization server. This property will only be populated if token exchange is enabled. | +| refreshToken | String? | The type of the token issued. | +| tokenType | String? | The type of the token issued. | +| expiresIn | Int? | A token which can be used to obtain new access tokens. | +| scope | [String]? | A comma separated list of scopes requested by the client. | + + +and the UberAuthError cases are defined [here](../Sources/UberAuth/Errors/UberAuthError.swift) + +To get auth credentials in the login callback, check the authorizationCode or accessToken properties on the client object. + +Before: +``` +loginManager.login( + requestedScopes: requestedScopes, + presentingViewController: self +) { (accessToken, error) -> () in + print(accessToken ?? "none") // Prints the access token +} +``` + +After: +``` +UberAuth.login { result in + switch result { + case .success(let client): + print(client.accessToken ?? "none") // Prints the access token + case .failure(let error): + // Handle UberAuthError + break + } +} +``` + +### Handling Responses +Previously, the UberAppDelegate API was used to pass through URLs entering the app. This API has been transitioned to the UberAuth interface. + +Before: +``` +func application(_ app: UIApplication, + open url: URL, + options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool { + let handledUberURL = UberAppDelegate.shared.application(app, open: url, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String, annotation: options[UIApplicationOpenURLOptionsKey.annotation] as Any) + + return handledUberURL +} +``` + +After: +``` +func application(_ app: UIApplication, + open url: URL, + options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { + + // If handled == true, UberAuth was able to accept the url + if let handled = UberAuth.handle(url) { + return true + } + ... +} +```