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

