You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS WebView中Universal Link路径无法传递的问题求助

你的核心问题是:仅在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 20:50:26