source/UberCore/Authentication/UberAppDelegate.swift (43 lines of code) (raw):
//
// UberAppDelegate.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.
/**
Responsible for parsing any events that require switching to the Uber app.
Designed to mimic methods from your application's AppDelegate and should
be called inside their corresponding methods
*/
@objc(UBSDKAppDelegate) public class UberAppDelegate : NSObject {
//MARK: Class variables
@objc public static let shared = UberAppDelegate()
//MARK: Public variables
@objc public var loginManager : LoginManaging?
//Mark: NSObject
public override init() {
super.init()
NotificationCenter.default.addObserver(self, selector: #selector(didBecomeActive), name: UIApplication.didBecomeActiveNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(willEnterForeground), name: UIApplication.willEnterForegroundNotification, object: nil)
}
deinit {
NotificationCenter.default.removeObserver(self)
}
//MARK: Public Methods
/**
Handles parsing a deeplink that can be handled by the Rides SDK. Should be
be called in your ApplicationDelegate:
application:openURL:sourceApplication:annotation: (iOS 8)
OR
app:openURL:options: (iOS 9+), passing in options[UIApplicationOpenURLOptionsSourceApplicationKey] as sourceApplication
- parameter application: Your singleton app object. As passed to the corresponding AppDelegate method
- parameter url: The URL resource to open. As passed to the corresponding AppDelegate methods
- parameter sourceApplication: The bundle ID of the app that is requesting
your app to open the URL (url). As passed to the corresponding AppDelegate method (iOS 8) or
options[UIApplicationOpenURLOptionsSourceApplicationKey] (iOS 9+)
- parameter annotation: A property list object supplied by the source app to
communicate information to the receiving app As passed to the corresponding AppDelegate method
- returns: true if the URL was intended for the Rides SDK, false otherwise
*/
@objc public func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any?) -> Bool {
guard let manager = loginManager else {
return false
}
let urlHandled = manager.application(application, open: url, sourceApplication: sourceApplication, annotation: annotation)
if (urlHandled) {
loginManager = nil
}
return urlHandled
}
@objc public func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
guard let options = launchOptions, let launchURL = options[UIApplication.LaunchOptionsKey.url] as? URL else {
return false
}
let manager = loginManager ?? LoginManager()
let sourceApplication = options[UIApplication.LaunchOptionsKey.sourceApplication] as? String
let annotation = options[UIApplication.LaunchOptionsKey.annotation] as Any?
let urlHandled = manager.application(application, open: launchURL, sourceApplication: sourceApplication, annotation: annotation)
loginManager = nil
return urlHandled
}
//MARK: Private Methods
@objc private func willEnterForeground(_ notification: Notification) {
if let manager = loginManager {
manager.applicationWillEnterForeground()
}
}
@objc private func didBecomeActive(_ notification: Notification) {
if let manager = loginManager {
manager.applicationDidBecomeActive()
}
}
}