- WKWebView需要在此代理方法中写入如下代码才能实现网页间的跳转,否则点击可能没有效果(判断request类型也在此代理中)
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void)
{
// 此代理中实现这个 解决网页某些点击不跳转的问题(跨域跳转问题)
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中也可以用如下的方法调起safari来打开网页
UIApplication.shared.open(url)
-
ATS的问题同样能影响webView内部网页的跳转
-
网页实现手势返回,自带的就有,只要打开设置
webView.allowsBackForwardNavigationGestures = true
-
webView和网页JS的交互我用的是第三方webViewJavascriptBridge,需要网页端在JS中也要注入部分代码才能实现互调(原生的貌似不用,也足够简单)
-
网页端现在有一个叫做 单页面 的技术,iOS中的webView加载此类页面中的页面跳转时,代理方法不走,而且返回和判断失效
// 一直为 false
webView.canGoBack
// 执行无效果
webView.goBack()
- 关于cookies的问题。UIWebView走的是全局的httpCookieStrorage,但是WKWebView不是。WKWebView仍然需要先设置全局的cookie然后转成其JS的格式再注入。
小Demo的链接请点击 WKWebView的Demo
网友评论