花落√莫相思

86-Swift之WKWebView的介绍和使用

2018-01-12  本文已影响0人  NetWork小贱

WKWebView 的介绍

WKWebView 是在Apple的WWDC 2014随iOS 8和OS X 10.10出来的,隶属于 WebKit 框架。它为了解决UIWebView 加载速度慢、占用内存大的问题。

WKWebView 的特性

WKWebView 的框架

784477-20161114144508482-1002417240.png

上图个类的介绍如下:

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)

上一篇下一篇

猜你喜欢

热点阅读