我遇到类似问题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
}
答案 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 }
}