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

SwiftUI开发的macOS浏览器WKWebView加载WhatsApp Web提示升级Safari

问题原因
  • 提前全局实例化WKWebView,后续创建的自定义配置无法绑定到已初始化的实例上,导致配置不生效
  • 默认WKWebView的User-Agent没有携带完整的Safari版本标识,WhatsApp网页版会通过UA校验浏览器兼容性,识别到非标准Safari UA时就会弹出升级提示
  • 代码中创建的WKPreferences没有实际绑定到WKWebView实例,部分JavaScript相关的特性没有正确开启
  • 没有显式设置WKWebView为桌面内容模式,部分网站的移动端适配逻辑会误判环境
解决方法
  1. 修正WKWebView的初始化逻辑,将自定义配置绑定到实例
  2. 手动设置User-Agent模拟桌面版Safari
  3. 开启必要的网页偏好配置,避免重复加载逻辑

修正后的代码如下:

struct WebView: NSViewRepresentable {
    @ObservedObject var webModel: WebStateModel
    
    func makeNSView(context: Context) -> WKWebView {
        // 创建自定义配置
        let config = WKWebViewConfiguration()
        let preferences = WKPreferences()
        preferences.javaScriptEnabled = true
        preferences.javaScriptCanOpenWindowsAutomatically = true
        config.preferences = preferences
        
        // 显式设置桌面内容模式
        let pagePrefs = WKWebpagePreferences()
        pagePrefs.preferredContentMode = .desktop
        config.defaultWebpagePreferences = pagePrefs
        
        // 初始化webview
        let wkWebview = WKWebView(frame: .zero, configuration: config)
        // 设置模拟Safari的User-Agent,可根据系统版本调整对应版本号
        wkWebview.customUserAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 14_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4 Safari/605.1.15"
        
        if let theUrl = webModel.url {
            // 首次加载清除旧缓存,避免错误页面残留
            let request = URLRequest(url: theUrl, cachePolicy: .reloadIgnoringLocalCacheData)
            wkWebview.load(request)
        }
        return wkWebview
    }
    
    func updateNSView(_ nsView: WKWebView, context: Context) {
        // 避免URL无变化时重复加载
        guard webModel.url != nsView.url else { return }
        if let theUrl = webModel.url {
            let request = URLRequest(url: theUrl, cachePolicy: .returnCacheDataElseLoad)
            nsView.load(request)
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 10:48:03