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

Swift WebView中如何监听URL变化并保存至UserDefaults?

监听WebView URL变化并保存到UserDefaults的实现方案

要实现监听WKWebView的URL变化并保存到UserDefaults,需要借助WKNavigationDelegate代理捕获URL变更事件,以下是基于你提供的代码修改后的完整实现:

核心实现步骤

  • 通过UIViewRepresentable的协调器(Coordinator)实现WKNavigationDelegate,监听WebView的导航事件
  • 在导航回调中获取当前URL,将其存入UserDefaults
  • 为WebView设置正确的导航代理

修改后的完整代码

import SwiftUI
import WebKit

struct VideoView: View {
    // 优先从UserDefaults读取上次保存的URL,无则用默认地址
    private let initialUrlString: String = UserDefaults.standard.string(forKey: "LastWebViewURL") ?? "https://www.google.com"
    
    var body: some View {
        VideoWebView(url: URL(string: initialUrlString)!)
            .shadow(color: .black.opacity(0.3), radius: 20.0, x: 5, y: 5)
    }
}

struct VideoWebView: UIViewRepresentable {
    var url: URL
    
    // 创建协调器,作为WKWebView的导航代理
    func makeCoordinator() -> Coordinator {
        Coordinator()
    }
    
    func makeUIView(context: Context) -> WKWebView {
        let webView = WKWebView()
        // 绑定导航代理到协调器
        webView.navigationDelegate = context.coordinator
        return webView
    }
    
    func updateUIView(_ webView: WKWebView, context: Context) {
        let request = URLRequest(url: url)
        webView.load(request)
    }
    
    // 协调器类,实现WKNavigationDelegate协议
    class Coordinator: NSObject, WKNavigationDelegate {
        // 页面加载完成后,获取当前URL并保存
        func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
            guard let currentUrl = webView.url?.absoluteString else { return }
            UserDefaults.standard.set(currentUrl, forKey: "LastWebViewURL")
        }
        
        // 可选:跳转请求发起时立即捕获目标URL(按需选择是否启用)
        func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
            if let targetUrl = navigationAction.request.url?.absoluteString {
                UserDefaults.standard.set(targetUrl, forKey: "LastWebViewURL")
            }
            decisionHandler(.allow) // 允许页面跳转
        }
    }
}

struct VideoView_Previews: PreviewProvider {
    static var previews: some View {
        VideoView()
    }
}

关键细节说明

  • 协调器的作用:作为WKWebView的代理载体,负责接收导航事件回调
  • UserDefaults存储逻辑:用LastWebViewURL作为存储键,每次URL变化时自动覆盖保存
  • 初始URL恢复:启动时优先读取上次保存的URL,实现页面状态的持久化
  • 两种监听方式:
    • didFinish:页面完全加载完成后获取最终URL,适合需要确保页面加载完成的场景
    • decidePolicyFor:跳转请求发起时立即捕获目标URL,适合实时跟踪跳转意图的场景(按需选择一种即可)

内容的提问来源于stack exchange,提问作者taxidriver

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 06:24:25