- WKWebView需要在此代理方法中寫(xiě)入如下代碼才能實(shí)現(xiàn)網(wǎng)頁(yè)間的跳轉(zhuǎn)盒揉,否則點(diǎn)擊可能沒(méi)有效果(判斷request類(lèi)型也在此代理中)
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void)
{
// 此代理中實(shí)現(xiàn)這個(gè) 解決網(wǎng)頁(yè)某些點(diǎn)擊不跳轉(zhuǎn)的問(wèn)題(跨域跳轉(zhuǎn)問(wèn)題)
if navigationAction.targetFrame == nil
{
webView.load(navigationAction.request)
}
// 判斷 request的類(lèi)型
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開(kāi)始提供了清理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來(lái)打開(kāi)網(wǎng)頁(yè)
UIApplication.shared.open(url)
ATS的問(wèn)題同樣能影響webView內(nèi)部網(wǎng)頁(yè)的跳轉(zhuǎn)
網(wǎng)頁(yè)實(shí)現(xiàn)手勢(shì)返回,自帶的就有卸留,只要打開(kāi)設(shè)置
webView.allowsBackForwardNavigationGestures = true
webView和網(wǎng)頁(yè)JS的交互我用的是第三方webViewJavascriptBridge,需要網(wǎng)頁(yè)端在JS中也要注入部分代碼才能實(shí)現(xiàn)互調(diào)(原生的貌似不用摹察,也足夠簡(jiǎn)單)
網(wǎng)頁(yè)端現(xiàn)在有一個(gè)叫做 單頁(yè)面 的技術(shù)泽谨,iOS中的webView加載此類(lèi)頁(yè)面中的頁(yè)面跳轉(zhuǎn)時(shí),代理方法不走帚桩,而且返回和判斷失效
// 一直為 false
webView.canGoBack
// 執(zhí)行無(wú)效果
webView.goBack()
- 關(guān)于cookies的問(wèn)題亿驾。UIWebView走的是全局的httpCookieStrorage,但是WKWebView不是账嚎。WKWebView仍然需要先設(shè)置全局的cookie然后轉(zhuǎn)成其JS的格式再注入莫瞬。
小Demo的鏈接請(qǐng)點(diǎn)擊 WKWebView的Demo