WKWebView浅析

原文链接:supermokey

WKWebView

一个WKWebView对象展示交互的web内容,例如应用于app内的浏览器。你可以在你的App中使用WKWebView。

综述

Important:

在iOS8.0和OS X 10.10以及以后,在App中开始使用WKWebView来加载web内容,不要(Do not use)使用UIWebView或者WebView。

当你使用 initWithFrame:configuration: 创建一个WKWebView对象之后,你就可以去加载web content了。使用 loadHTMLString:baseURL: 方法开始加载本地的HTML文件或者使用 loadRequest: 方法开始加载web内容。使用 :stopLoading 方法来结束加载,属性 loading 可以来检测当前web 视图是否正在加载。对一个对象设置遵循WKUIDelegate协议来追踪web内容的加载。

为了允许用户能够返回和前进来浏览网页的历史,使用 goBack 和 goForward 方法来进行操作(可以写一个button,来后让button调用goBack 和 goFroward)。使用 canGoBack 和 canGoForward 属性来判断网页是否可以返回或者前进,从而来设置button能否点击。

默认的,一个网页时默认将数字转换成手机号码的。当点击的时候,会拨打该号码,要想关闭这个默认的行为,可以设置dataDetectorTypes属性的WKDtaDetectorTypes字段不包含WKDataDetectorTypePhoneNumber标识。

你也可以使用 setMagnification: centeredAtPoint: 来设置网页第一次展示的比例。以后,用户可以使用手势来改变这个展示比例。

符号
初始化一个网页视图
  1. configuration

    拷贝一个configuration来初始化一个网页使用。它是一个属性的集合,这个集合用来初始化网页。
  2. initWithFrame:configuration:

    初始化一个网页视图,设置其大小和配置
  3. initWithCoder:

    从解档数据获取一个初始化的对象。
检查视图信息
  1. scrollview

    和网页关联的滚动视图。
  2. ​title

    当前页的title。
  3. ​URL

    当前请求网页的URL(NSURL类型)
  4. customUserAgent

    用户自定义代理字符串。如果没有用户自定义的代理字符串,它会被设置为nil。只在iOS9之后可用。
  5. serverTrust

    当前委托对象的SecTrustRef对象。
设置代理
  1. navigationDelegate

    网页视图导航代理
  2. UIDelegate

    网页视图用户界面代理
装载内容(Loading content)
  1. estimatedProgress

    当前navigation加载的进度,区间是0.0-1.0,加载进度包括主要的文档和一些其他的子资源文件,当资源加载完成之后,会一直保持在1.0,直到有新的navigation开始,它才会被重置为0.0。WKWebView类的这个属性符合KVO监听。
  2. hasOnlySecureContent

    要加载的网页的所有资源是否都是通过安全编码链接加载的。YES表示是,NO表示不是。也是用KVO监听实现的。
  3. loadHTMLString:baseURL:

    设置网页的内容和基URL。返回一个新的导航。
  4. loading

    判断当前网页是否在加载,getter的时候使用isLoading。
  5. reload

    从新加载页面内容。返回一个新的WKNavigation。
  6. reloadFromOrigin

    重新加载页面,如果可能,使用缓存验证条件语句执行端到端的重新验证。
  7. stopLoading

    停止加载当前页面所有的资源。
  8. loadData:MIMEType:characterEncodingName:baseURL:

    设置网页内容和基URL,iOS9之后可用。
  9. loadFileURL:allowingReadAccessToURL:

    导航到文件系统上请求URL。如果readAccessURL引用单个文件,则只有该文件可能由WKWebView加载;如果readAccessURL引用一个目录,那么该目录的文件可能由WKWebView加载。
缩放内容(Scaling conetent)
  1. allowMagnification

    一个bool值,用来标示webView是否支持放大手势更改视图的比例,默认值为NO。(不能再iPhone上使用,#if !TARGET_OS_IPHONE #endif包含着)
  2. magnification

    当前放大的比例,默认是1.0。(不能再iPhone上使用,#if !TARGET_OS_IPHONE #endif包含着)
  3. setMagnification:centeredAtPoint:

    按照指定的因子来缩放网页内容并居中结果到指定的点。(不能再iPhone上使用,#if !TARGET_OS_IPHONE #endif包含着)
导航
  1. allowsBackForwardNavigationGestures

    指示水平滑动手势是否将触发向前列表导航。YES表示是,默认为NO。设置为YES后,你就会发现,点击链接到的某个页面之后右划即可返回到上一个页面,左划即可返回到链接的页面,而且效果和push差不多。
  2. backForwardList

    网页视图的后向列表。WKBackForwardList对象维护用于返回并转发到最近的页面的被访问页面的列表。WKBackForwardList对象仅维护列表数据,它不执行实际的页面加载(换句话说,它不会产生任何客户端请求)。 如果您需要执行页面加载,请参阅WKWebView中的loadRequest:方法以了解如何执行此操作。具体可参见WKBackForwardList类。
  3. canGoBack

    判断网页是否能够返回,一个布尔值,表示在前向列表中是否有可以导航到的后面项目。
  4. canGoForward

    一个布尔值,表示在可以导航到的前向列表中是否有前向项目。
  5. allowsLinkPreview

    是否支持预览。 在iOS中,此属性适用于支持3D Touch的设备。 iOS中的默认值为NO。

    如果将此属性的值设置为YES,iOS用户可以按链接以预览链接目标和检测到的数据,例如地址和电话号码。这样的预览对于用户来说是已知的。如果用户在链接预览上更深入地按下,则预览导航(或在用户术语中弹出)到目的地。由于pop导航将用户从您的应用程序切换到Safari,因此它选择启用iOS应用程序。

    如果你想在iOS中支持链接预览,但也想让用户在你的应用程序中,你可以从使用WKWebView类切换到SFSafariViewController类。如果你将网络视图用作应用内浏览器,则进行此更改是最佳做法。 Safari视图控制器类自动支持链接预览。

    在macOS中,此属性在具有Force Touch触控板的设备上可用。 macOS中的默认值为YES。

    将此属性设置为其默认值YES时,macOS用户可以强制单击链接以显示显示链接目标的预览窗口。如果用户点击预览,目标将在Safari中打开。

    在这两个平台上,当此属性设置为YES时,所有类型的检测到的数据都会响应按下。也就是说,在iOS 9和OS X v10.11中,你不能指定在WKWebView类中检测到哪些类型的数据。
  6. goBack

    导航到后退列表的后一项。
  7. goForward

    导航到前进列表的中的前进项目。
  8. goToBackForwarListItem:

    导航到来自前向列表的项目,并将其设置为当前项目。
  9. loadRequest:

    导航到将要请求的URL。
执行javaScript
  1. evaluateJavaScript:completionHandler:

    评估javaScript字符串。该方法将脚本评估的结果(或错误)发送到完成处理程序。 完成处理程序总是在主线程上(Main thread)运行。
实例化方法
  1. goBack:
  2. goForward:
  3. reload:
  4. reloadFromOrigin:
  5. stopLoading:

    上面几个方法都是WKIBActions分类的方法。具体可以参见官方API,和上面的说的方法类似
三个协议
  1. WKNavigationDelegate: 提供了追踪主窗口网页加载过程和判断主窗口和子窗口是否进行页面加载新页面的相关方法。
  2. WKScriptMessageHandler: 提供从网页中收消息的回调方法。
  3. WKUIDelegate: 提供用原生控件显示网页的方法回调。
总结

以后在开发的过程中,我们应该使用WKWebView,尽量不要去使用UIWebView,在我看来,WKWebView至少解决了两大难题:

  1. 加载进度
  2. 内存泄露
  3. 支持手动设置alert展示

对它的理解也仅仅是皮毛,在以后的开发过程中进一步了解学习吧。

参考
  1. 苹果官方文档
  2. NSHipster
上一篇:shell之使用paste命令按列拼接多个文件


下一篇:idea为tomcat设置虚拟地址