WKWebView无法加载WhatsApp Web

3
我有一个使用SwiftUI和WebKitView制作的macOS网络浏览器,可以在大多数网站上正常运行,但是在某些页面上(比如WhatsApp),我会得到以下错误消息,提示我升级到更新版本的Safari。

enter image description here

WebView

struct WebView: NSViewRepresentable {
    @ObservedObject var webModel: WebStateModel
    
    let wkWebview = WKWebView()
    
    func makeNSView(context: Context) -> WKWebView {
        if let theUrl = webModel.url {
            let request = URLRequest(url: theUrl, cachePolicy: .returnCacheDataElseLoad)
            wkWebview.load(request)
        }
        
        let preferences = WKPreferences()
        preferences.javaScriptEnabled = true
        
        return wkWebview
    }
    
    func updateNSView(_ nsView: WKWebView, context: Context) {
        if let theUrl = webModel.url {
            let request = URLRequest(url: theUrl, cachePolicy: .returnCacheDataElseLoad)
            nsView.load(request)
        }
    }
2个回答

2
 func loadwebview(url: String) {

    let url = URL(string: url.removingWhitespaces())
    
    if url != nil {
        let requestObj = URLRequest(url: url!)
        let userAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36"
        self.wkWebView.customUserAgent = userAgent

        //requestObj.addValue(userAgent, forHTTPHeaderField: "User-Agent")

        DispatchQueue.main.async {
            self.wkWebView.uiDelegate = self
            self.wkWebView.navigationDelegate = self
            self.wkWebView.load(requestObj)
        }
    }
}

2
首先,您可以使用Safari Services而不是WKWebView,这样您实际上将使用兼容的浏览器。
否则,这取决于站点如何检查所加载的浏览器。
  • 检查浏览器类型和版本最原始的方法是查看浏览器的user agent string。对于这种情况,您可以通过在WKWebView上设置customUserAgent来绕过检查,以支持站点所需的内容。这是一种hack方式,因为您的WKWebView会假装成不同的浏览器。

  • 更复杂的情况不是检查实际的浏览器,而是它们需要的功能。例如,网站可能会检查cookie或本地存储是否已启用。在这种情况下,您应该在WKWebView上启用所需的功能。

  • 在第三种情况下,网站尝试明确阻止将其内容嵌入到WKWebView或WebView中。在这种情况下,您必须尊重网站所有者的意愿,不要尝试嵌入该站点。

WhatsApp属于哪一种情况,不太确定。我想你需要进行实验。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接