WKWebView 未加载 WhatsApp Web

WKWebView not loading WhatsApp Web

我有一个使用 SwiftUI 和 WebKitView 制作的 macOS 网络浏览器,它适用于大多数网站,但某些页面,例如 WhatsApp 我收到以下错误消息,需要升级到更新版本的 safari。

网络视图

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)
        }
    }

首先,您可以使用 Safari Services 而不是 WKWebView,因此您实际上使用的是兼容的浏览器。

否则,这取决于站点如何检查加载它的浏览器。

  • 最原始的查看浏览器类型和版本的方法,就是看浏览器在WKWebView上的user agent string. For cases like this, you may be able to surpass the check by setting a customUserAgent是什么网站支持。不过这是一种 hack,因为您的 WKWebView 假装是不同的浏览器。

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

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

WhatsApp 的情况是哪一个,不太确定。我想你将不得不进行实验。

 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)
        }
    }
}