当应用不在后台时打开通用链接

时间:2017-03-08 15:39:51

标签: ios swift swift3 ios-universal-links

我遇到类似问题iOS: apple universal link if app is not open?。当我点击通用链接时,如果该应用不在后台,则该应用无法进入func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool {}

我在didFinishLaunchingWithOptions中添加了一些代码。但它不起作用。非常感谢,如果有人可以提供帮助。

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

}

6 个答案:

答案 0 :(得分:5)

将此代码放入didFinishLaunchingWithOptions函数以在应用启动时打开URL( Swift 3代码):

    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
                }
            }
        }
    }

答案 1 :(得分:2)

    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 

        }

    }

如果您无法以传统方式访问“userActivity”,请使用上述方法。

答案 2 :(得分:1)

在AppDelegate didFinishLaunchingWithOptions方法

中使用此代码
    //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)
                }
            }
        }
    }

在app delegate中你需要方法

private class func handleOpenURLWhenAppIsNotOpen(_ url: URL) {
     //can make what you like
}

答案 3 :(得分:0)

我使用Branch.io来处理通用链接。如果有人需要,以下代码供参考。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    //branch.io
    let branch: Branch = Branch.getInstance()
    branch.initSession(launchOptions: launchOptions, andRegisterDeepLinkHandler: {params, error  in
        // If the key 'pictureId' is present in the deep link dictionary
        if error == nil && params!["pictureId"] != nil {
            print("clicked picture link!")
            // load the view to show the picture
        } else {
            // load your normal view
        }
    })
    //branch io

    FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions) //don't put it on return
    return true
}

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
        // pass the url to the handle deep link call
        Branch.getInstance().continue(userActivity)

}

答案 4 :(得分:0)

迅速4、5(有效的解决方案)

您可以尝试以下代码段:

if let launchOptions = launchOptions, let dict = launchOptions[UIApplication.LaunchOptionsKey.userActivityDictionary] as? NSDictionary {
    if let userActivity = dict.first(where: { $0.value as? NSUserActivity != nil })?.value as? NSUserActivity {
       // handle your logic here
    }
}

答案 5 :(得分:0)

对于 IOS14 Swift 5 ,请使用SceneDelegate文件和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 }
    }