source/UberRides/RequestDeeplink.swift (43 lines of code) (raw):

// // RequestDeeplink.swift // UberRides // // Copyright © 2015 Uber Technologies, Inc. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import CoreLocation import UIKit import UberCore /** * Builds and executes a deeplink to the native Uber app to request a ride. */ @objc(UBSDKRequestDeeplink) public class RequestDeeplink: BaseDeeplink { static let sourceString = "deeplink" private let rideParameters: RideParameters private let fallbackType: DeeplinkFallbackType /** Initialize a ride request deeplink. If the Uber app is not installed, fallback to the App Store. */ @objc public convenience init(rideParameters: RideParameters = RideParametersBuilder().build()) { self.init(rideParameters: rideParameters, fallbackType: DeeplinkFallbackType.appStore) } /** Initialize a ride request deeplink. */ @objc public init(rideParameters: RideParameters, fallbackType: DeeplinkFallbackType) { self.rideParameters = rideParameters self.fallbackType = fallbackType self.rideParameters.source = rideParameters.source ?? RequestDeeplink.sourceString let queryItems = RequestURLUtil.buildRequestQueryParameters(rideParameters) let scheme = "uber" let domain = "" super.init(scheme: scheme, host: domain, path: "", queryItems: queryItems)! } public override var fallbackURLs: [URL] { var urls = super.fallbackURLs if let fallbackURL = buildFallbackURL() { urls.append(fallbackURL) } return urls } private func buildFallbackURL() -> URL? { switch fallbackType { case .mobileWeb: if var urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: false) { urlComponents.scheme = "https" urlComponents.host = "m.uber.com" return urlComponents.url } case .appStore: let deeplink = RidesAppStoreDeeplink(userAgent: rideParameters.userAgent) return deeplink.url default: break } return nil } }