- WKWebView需要在此代理方法中寫入如下代碼才能實現(xiàn)網(wǎng)頁間的跳轉,否則點擊可能沒有效果(判斷request類型也在此代理中)
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void)
{
// 此代理中實現(xiàn)這個 解決網(wǎng)頁某些點擊不跳轉的問題(跨域跳轉問題)
if navigationAction.targetFrame == nil
{
webView.load(navigationAction.request)
}
// 判斷 request的類型
let requestType = navigationAction.navigationType
switch requestType
{
case .backForward: print("backForward")
case .formResubmitted: print("formResubmitted")
case .formSubmitted: print("formSubmitted")
case .linkActivated: print("linkActivated")
case .reload: print("reload")
case .other: print("other")
}
decisionHandler(.allow)
}
- 清除WKWebview的緩存
private func clearWKWebViewCache()
{
// iOS9開始提供了清理WKWebView的API
let version = UIDevice.current.systemVersion
guard let aVersion = Double(version), aVersion > 9.0 else { return }
let websiteDataTypes = Set([WKWebsiteDataTypeDiskCache,
WKWebsiteDataTypeMemoryCache,
WKWebsiteDataTypeOfflineWebApplicationCache,
WKWebsiteDataTypeCookies,
WKWebsiteDataTypeSessionStorage,
WKWebsiteDataTypeLocalStorage,
WKWebsiteDataTypeWebSQLDatabases,
WKWebsiteDataTypeIndexedDBDatabases])
let date = Date(timeIntervalSince1970: 0)
WKWebsiteDataStore.default().removeData(ofTypes: websiteDataTypes, modifiedSince: date, completionHandler: {})
}
- WKWebView中也可以用如下的方法調(diào)起safari來打開網(wǎng)頁
UIApplication.shared.open(url)
ATS的問題同樣能影響webView內(nèi)部網(wǎng)頁的跳轉
網(wǎng)頁實現(xiàn)手勢返回,自帶的就有,只要打開設置
webView.allowsBackForwardNavigationGestures = true
webView和網(wǎng)頁JS的交互我用的是第三方webViewJavascriptBridge,需要網(wǎng)頁端在JS中也要注入部分代碼才能實現(xiàn)互調(diào)(原生的貌似不用,也足夠簡單)
網(wǎng)頁端現(xiàn)在有一個叫做 單頁面 的技術,iOS中的webView加載此類頁面中的頁面跳轉時,代理方法不走,而且返回和判斷失效
// 一直為 false
webView.canGoBack
// 執(zhí)行無效果
webView.goBack()
- 關于cookies的問題。UIWebView走的是全局的httpCookieStrorage,但是WKWebView不是。WKWebView仍然需要先設置全局的cookie然后轉成其JS的格式再注入。
小Demo的鏈接請點擊 WKWebView的Demo