86-Swift之WKWebView的介绍和使用
2018-01-12 本文已影响0人
NetWork小贱
WKWebView 的介绍
WKWebView 是在Apple的WWDC 2014随iOS 8和OS X 10.10出来的,隶属于 WebKit 框架。它为了解决UIWebView 加载速度慢、占用内存大的问题。
WKWebView 的特性
- 更多的支持HTML5的特性
- 官方宣称的高达60fps的滚动刷新率以及内置手势
- Safari相同的JavaScript引擎
- 将UIWebViewDelegate与UIWebView拆分成了14类与3个协议(官方文档说明)
- 另外用的比较多的,增加加载进度属性:estimatedProgress
WKWebView 的框架
784477-20161114144508482-1002417240.png上图个类的介绍如下:
- WKWebViewConfiguration : 是网页配置类。
- WKPreference : 网页预先先选择配置类。
- WKProcessPool : 网页加载进程池(资源共享)。
- WKUserContentController: 用户交互类(这个类主要用来做native与JavaScript的交互管理).
*WKUserScript: 用户脚本注册类。 - WKScriptMessageHandler : 用户消息方法类(这个类专门用来处理JavaScript调用native的方法)。
*WKNavigationDelegate:网页跳转间的导航管理协议,这个协议可以监听网页的活动。 - WKNavigationAction :网页导航一个按钮。
- WKUIDelegate: 用来处理网页弹出框。
- WKBackForwardList : 网页堆栈里网页列表对象。
*WKBackForwardListItem:网页节点对象。
WKWebView 的类的介绍
WKPreferences 的介绍
// MARK: WKPreferences 的介绍
func initializePreferences() -> WKPreferences {
// TODO: 创建对象
let preferences = WKPreferences.init()
// TODO: 设置网页的字体
preferences.minimumFontSize = 10
// TODO: 设置网页 JavaScript 是否可用
preferences.javaScriptEnabled = true
// TODO: 是否允许打开新的窗口(IOS 没有该功能)
preferences.javaScriptCanOpenWindowsAutomatically = false
// TODO: 返回配置
return preferences
}
WKUserContentController 的介绍
// MARK: WKUserContentController 的介绍
func initializeUserContentController() -> WKUserContentController {
// TODO: 初始化
let userContentController = WKUserContentController.init()
// TODO: 用户脚本的获取
let userScripts = userContentController.userScripts
print(userScripts)
// TODO: 添加脚本
userContentController.addUserScript(WKUserScript.init(source: "脚本代码", injectionTime: WKUserScriptInjectionTime.atDocumentStart, forMainFrameOnly: true))
// TODO: 删除所有用户的脚本
userContentController.removeAllUserScripts()
// TODO: 添加消息函数 (发送消息的方法:window.webkit.messageHandlers.消息.postMessage(消息对象))
userContentController.add(self as WKScriptMessageHandler, name: "消息")
// TODO: 移除指定的添加消息
userContentController.removeScriptMessageHandler(forName: "消息")
// TODO: 添加内容规则列表
userContentController.add(WKContentRuleList.init())
// TODO: 移除内容规则列表
userContentController.remove(WKContentRuleList.init())
// TODO:移除所有的
userContentController.removeAllContentRuleLists()
// TODO: 返回对象
return userContentController
}
// TODO: 发送消息的处理函数
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
}
WKWebViewConfiguration 的介绍
// MARK: WKWebViewConfiguration 的介绍
func initializeConfiguration() -> WKWebViewConfiguration {
// TODO: 初始化对象
let configuration = WKWebViewConfiguration.init()
// TODO: 创建WebView的内容进程池
configuration.processPool = WKProcessPool.init()
// TODO: 网页首选的设置项
configuration.preferences = WKPreferences.init()
// TODO: 将用户内容控制器与webView关联起来
configuration.userContentController = WKUserContentController.init()
// TODO: 设置网页数据缓存到内存中在显示
configuration.suppressesIncrementalRendering = true
// TODO: 网页请求头部 UserAgent 的设置 (User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等)
configuration.applicationNameForUserAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/604.4.7 (KHTML, like Gecko) Version/11.0.2 Safari/604.4.7"
// TODO: 是否允许播放 AirPlay
configuration.allowsAirPlayForMediaPlayback = true
// TODO: 媒体播放的类型 (audio/video)
configuration.mediaTypesRequiringUserActionForPlayback = .video
// TODO: 媒体播放是否可以全屏控制
configuration.allowsInlineMediaPlayback = true
// TODO: 设置用户在WebView 中选择内容的级别 (dynamic 、 character )
configuration.selectionGranularity = .character
// TODO: 设置是否支持播视频窗口浮动(画中画视频播放就将视频播放窗口化,然后浮动在屏幕上)
configuration.allowsPictureInPictureMediaPlayback = true
// TODO: 是否指示数据监测类型 (监测手机号)
configuration.dataDetectorTypes = .phoneNumber
// TODO: 判断网页是否始终允许页面的缩放
configuration.ignoresViewportScaleLimits = false
// TODO: 处理自定义的 ‘URL Scheme’
configuration.setURLSchemeHandler(self as WKURLSchemeHandler, forURLScheme: "AppOpen")
// TODO: 返回已经注册的 "URL Scheme" 处理对象
let urlSchemeObject = configuration.urlSchemeHandler(forURLScheme: "AppOpen")
print(urlSchemeObject)
// TODO: 返回配置对象
return configuration
}
// TODO: 处理自定的 ‘URL scheme’
func webView(_ webView: WKWebView, start urlSchemeTask: WKURLSchemeTask) {
// 开始
}
func webView(_ webView: WKWebView, stop urlSchemeTask: WKURLSchemeTask) {
// 结束
}
WKWebView 的两个代理的介绍
WKNavigationDelegate 的介绍
// MARK:WKNavigationDelegate 代理介绍
// TODO: 决定导航的动作,通常处理跨域连接能否导航。
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
}
// TODO: 临时导航创建时调用该方法
func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
}
// TODO: 网页加载完成时
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
}
// TODO: 导航网页加载失败时,调用此函数
func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
}
// TODO: 导航网页内容到达时,调用该函数
func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
}
// TODO: 临时导航创建失败时,调用此函数
func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
}
// TODO: 网络身份认证
func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
}
//TODO: 当网页内容进程终止时,调用该函数
func webViewWebContentProcessDidTerminate(_ webView: WKWebView) {
}
// TODO:当主服务器接收到服务器重定向时调用。重定向(redirection)是Web编程中的一个重要的技术。运用重定向,你可以把控件发送到另一个servlet/JSP页面,或将Web浏览器(用户)重定向到一个新的URL。
func webView(_ webView: WKWebView, didReceiveServerRedirectForProvisionalNavigation navigation: WKNavigation!) {
}
// TODO: 决定是否接受响应,通过导航的描述信息是否允许网页显示
func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
}
WKUIDelegate 的介绍
// MARK:WKUIDelegate
// TODO: 创建一个WebView
func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
return WKWebView.init(frame: self.view.frame)
}
// TODO: 网页移除时调用该函数
func webViewDidClose(_ webView: WKWebView) {
}
// TODO: 显示一个JavaScript警告面板。如果不实现该方法默认用户选择“OK”
func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void) {
}
// TODO:显示一个JavaScript确认面板。如果不实现该方法默认用户选择取消
func webView(_ webView: WKWebView, runJavaScriptConfirmPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (Bool) -> Void) {
}
// TODO: 显示一个JavaScript文本输入面板
func webView(_ webView: WKWebView, runJavaScriptTextInputPanelWithPrompt prompt: String, defaultText: String?, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (String?) -> Void) {
}
// TODO: 允许您的应用程序确定给定元素是否应该显示预览
func webView(_ webView: WKWebView, shouldPreviewElement elementInfo: WKPreviewElementInfo) -> Bool {
return true
}
// TODO:允许你的应用程序弹出到它创建的视图控制器
func webView(_ webView: WKWebView, commitPreviewingViewController previewingViewController: UIViewController) {
}
//TODO:允许您的应用程序提供自定义视图控制器,以便在给定的元素被预览时显示
func webView(_ webView: WKWebView, previewingViewControllerForElement elementInfo: WKPreviewElementInfo, defaultActions previewActions: [WKPreviewActionItem]) -> UIViewController? {
return UIViewController.init()
}
WKWebView 的创建和属性和方法介绍
// TODO: WKWebView 是继承与 UIView
// TODO: WKWebView 有两个代理 WKNavigationDelegate 和 WKUIDelegate
// TODO: 网页的初始化
let wkWebView = WKWebView.init(frame: self.view.frame, configuration: self.initializeConfiguration())
// TODO: 为一个请求创建一个新的导航
var navigation = wkWebView.load(URLRequest.init(url: URL.init(string: "")!))
// TODO: 加载本地连接
navigation = wkWebView.loadFileURL(URL.init(fileURLWithPath: " "), allowingReadAccessTo: URL.init(fileURLWithPath: ""))
// TODO: 加载 'XML'
navigation = wkWebView.loadHTMLString("", baseURL: URL.init(fileURLWithPath: ""))
// TODO: 加载二进制数据
navigation = wkWebView.load(Data.init(), mimeType: "text/html", characterEncodingName: "UTF-8", baseURL: URL.init(string: "")!)
// TODO: 网页跳转
navigation = wkWebView.go(to: wkWebView.backForwardList.forwardList.first!)
// TODO: 获取网页的 ‘title’
let title = wkWebView.title
print(title!)
// TODO: 网页加载的网址
let url = wkWebView.url
print(url!)
// TODO: 网页是否在加载
let isload = wkWebView.isLoading
print(isload)
// TODO: 网页加载进度的获取
let progress = wkWebView.estimatedProgress
print(progress)
// TODO: 判断网页资源是否安全加载
let isSecure = wkWebView.hasOnlySecureContent
print(isSecure)
// TODO: 获取当前提交的验证规则
let st = wkWebView.serverTrust
print(st!)
// TODO: 判断网页是否可以返回
let isCanBack = wkWebView.canGoBack
print(isCanBack)
navigation = wkWebView.goBack()
// TODO: 判断网页是否可以前进
let isForw = wkWebView.canGoForward
print(isForw)
navigation = wkWebView.goForward()
// TODO: 网页的刷新
navigation = wkWebView.reload()
// TODO: 考虑缓存情况重新加载
navigation = wkWebView.reloadFromOrigin()
// TODO: 停止网页加载
wkWebView.stopLoading()
// TODO: 执行js
wkWebView .evaluateJavaScript("js函数") { (any, error) in
// 结果返回
}
// TODO: 是否支持手势返回
wkWebView.allowsBackForwardNavigationGestures = true
// TODO: 设置代理字符串
wkWebView.customUserAgent = ""
// TODO: 设置是否支持连接预览
wkWebView.allowsLinkPreview = true
// TODO: 获取网页的 ScrollView
let scrollView = wkWebView.scrollView
print(scrollView)
// TODO: 判断网页是否处理给定的 ‘URL scheme’
let isURLScheme = WKWebView.handlesURLScheme("AppOpen")
print(isURLScheme)
// TODO: 获取网页的所有证书
let isCertificateChain = wkWebView.certificateChain
print(isCertificateChain)