iOS WebView中Universal Link路径无法传递的问题求助
Universal Link URL路径无法传递到WebView的解决方法
你的核心问题是:仅在AppDelegate中获取了Universal Link的URL,但没有实际将URL传递给WebView加载,同时缺少冷启动场景的处理逻辑,iOS 13+还需考虑SceneDelegate的生命周期回调。
1. 处理冷启动场景(AppDelegate)
冷启动时,Universal Link的参数会通过launchOptions传递,需要在didFinishLaunchingWithOptions中解析并让WebView加载目标URL:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // 初始化窗口与根视图控制器(根据你的实际代码调整) window = UIWindow(frame: UIScreen.main.bounds) let mainVC = MainViewController() // 假设主视图控制器包含WebView实例 window?.rootViewController = mainVC window?.makeKeyAndVisible() // 解析冷启动时的Universal Link if let userActivityDict = launchOptions?[.userActivityDictionary] as? [String: Any], let userActivity = userActivityDict["UIApplicationLaunchOptionsUserActivityKey"] as? NSUserActivity, userActivity.activityType == NSUserActivityTypeBrowsingWeb, let targetURL = userActivity.webpageURL { // 让WebView加载目标URL if let mainVC = window?.rootViewController as? MainViewController { mainVC.webView.load(URLRequest(url: targetURL)) } } // 兼容直接通过URL参数传递的场景 else if let targetURL = launchOptions?[.url] as? URL { if let mainVC = window?.rootViewController as? MainViewController { mainVC.webView.load(URLRequest(url: targetURL)) } } return true }
2. 处理热启动场景(AppDelegate)
修改你原有的continue userActivity方法,添加WebView加载逻辑:
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { guard userActivity.activityType == NSUserActivityTypeBrowsingWeb, let targetURL = userActivity.webpageURL else { return false } // 将目标URL传递给WebView加载 if let mainVC = window?.rootViewController as? MainViewController { mainVC.webView.load(URLRequest(url: targetURL)) } return true }
3. iOS 13+ 适配SceneDelegate
如果你的APP使用SceneDelegate(iOS 13及以上),还需要在SceneDelegate中处理对应的回调:
// 处理热启动时的Universal Link func scene(_ scene: UIScene, continue userActivity: NSUserActivity) { guard userActivity.activityType == NSUserActivityTypeBrowsingWeb, let targetURL = userActivity.webpageURL else { return } if let mainVC = (scene as? UIWindowScene)?.window?.rootViewController as? MainViewController { mainVC.webView.load(URLRequest(url: targetURL)) } } // 处理冷启动时的Universal Link func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { if let userActivity = connectionOptions.userActivities.first, userActivity.activityType == NSUserActivityTypeBrowsingWeb, let targetURL = userActivity.webpageURL { if let mainVC = (scene as? UIWindowScene)?.window?.rootViewController as? MainViewController { mainVC.webView.load(URLRequest(url: targetURL)) } } }
额外注意事项
- 确保能正确获取到WebView实例:如果根视图控制器是导航控制器,需调整为
window?.rootViewController as? UINavigationController后取topViewController。 - 验证Universal Link配置:检查
apple-app-site-association文件是否包含目标路径,APP的associated domains是否正确配置(格式为applinks:yourdomain.com)。
内容的提问来源于stack exchange,提问作者plat_winz
相关产品推荐
相关产品推荐

