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)
}
}
}
我有一个使用 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)
}
}
}