Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Open universal link when app is not in background

I have similar case with this problem iOS: apple universal link if app is not open? . When I click an universal link, the app could not go into func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool {} if it is not in background.

I added some codes in the didFinishLaunchingWithOptions. However it is not working. Thank you so much If anyone could help.

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    let activityDic = launchOptions?[UIApplicationLaunchOptionsKey.userActivityDictionary]
    if activityDic != nil {
        // Continue activity here
        self.window?.rootViewController?.restoreUserActivityState(activityDic as! NSUserActivity)
    }


   return true
}

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
    if userActivity.activityType == NSUserActivityTypeBrowsingWeb {          
            if let controller = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "xxx") as? XXXTableViewController {
                if let window = self.window, let rootViewController = window.rootViewController {
                    var currentController = rootViewController
                    while let presentedController = currentController.presentedViewController {
                        currentController = presentedController
                    }
                    currentController.present(controller, animated: true, completion: nil)
                }
            }
    }

    return true

}
like image 519
ray Avatar asked Mar 08 '17 15:03

ray


4 Answers

Place this code into didFinishLaunchingWithOptions function to open the URL when the app launch (Swift 3 code) :

    if let url = launchOptions?[UIApplicationLaunchOptionsKey.url] as? URL { //Deeplink
        // process url here
    }
    else if let activityDictionary = launchOptions?[UIApplicationLaunchOptionsKey.userActivityDictionary] as? [AnyHashable: Any] { //Universal link
        for key in activityDictionary.keys {
            if let userActivity = activityDictionary[key] as? NSUserActivity {
                if let url = userActivity.webpageURL {
                    // process url here
                }
            }
        }
    }
like image 86
Bogy Avatar answered Oct 14 '22 00:10

Bogy


For IOS14 Swift 5 use SceneDelegate file and func

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        // Get URL components from the incoming user activity.
        guard let userActivity = connectionOptions.userActivities.first,
              userActivity.activityType == NSUserActivityTypeBrowsingWeb,
              let incomingURL = userActivity.webpageURL
        else { return }
        DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
            LinkHandler.sharedInstance.handleLink(url: incomingURL)
        }
        guard let _ = (scene as? UIWindowScene) else { return }
    }
like image 22
Dmih Avatar answered Oct 13 '22 22:10

Dmih


    if let activityDic = launchOptions?[UIApplicationLaunchOptionsUserActivityDictionaryKey] {

        let options = activityDic.allValues.filter({ (option:AnyObject) -> Bool in

            return option is NSUserActivity
        })

        if options.count > 0 , let userActivity = options[0] as? NSUserActivity{
            // User activity handling should be done here 

        }

    }

Use the above method if you can't access 'userActivity' in conventional way.

like image 44
Ashish Jith Avatar answered Oct 14 '22 00:10

Ashish Jith


You can access the URL in the launch options dictionary that is passed to your app at initialization time. Example of an implementation inside the AppDelegate application(_:didFinishLaunchingWithOptions:) method:

// Catch if open app from url
if let options = launchOptions {
    for key in options.keys {
        if(key == UIApplicationLaunchOptionsKey.url) {
            if let url = options[key] as? URL {
                AppDelegate.handleOpenURLWhenAppIsNotOpen(url)
            }
        }
    }
}

// or
if let url = launchOptions?[UIApplication.LaunchOptionsKey.url] as? URL {
    AppDelegate.handleOpenURLWhenAppIsNotOpen(url)
}

In AppDelegate you need method:

private class func handleOpenURLWhenAppIsNotOpen(_ url: URL) {
     //can make what you like
}
like image 29
Svetoslav Bramchev Avatar answered Oct 13 '22 22:10

Svetoslav Bramchev