原文链接: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

WKWebView浅析的更多相关文章

  1. SQL Server on Linux 理由浅析

    SQL Server on Linux 理由浅析 今天的爆炸性新闻<SQL Server on Linux>基本上在各大科技媒体上刷屏了 大家看到这个新闻都觉得非常震精,而美股,今天微软开 ...

  2. 【深入浅出jQuery】源码浅析--整体架构

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  3. 高性能IO模型浅析

    高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking  ...

  4. netty5 HTTP协议栈浅析与实践

      一.说在前面的话 前段时间,工作上需要做一个针对视频质量的统计分析系统,各端(PC端.移动端和 WEB端)将视频质量数据放在一个 HTTP 请求中上报到服务器,服务器对数据进行解析.分拣后从不同的 ...

  5. Jvm 内存浅析 及 GC个人学习总结

    从诞生至今,20多年过去,Java至今仍是使用最为广泛的语言.这仰赖于Java提供的各种技术和特性,让开发人员能优雅的编写高效的程序.今天我们就来说说Java的一项基本但非常重要的技术内存管理 了解C ...

  6. 从源码浅析MVC的MvcRouteHandler、MvcHandler和MvcHttpHandler

    熟悉WebForm开发的朋友一定都知道,Page类必须实现一个接口,就是IHttpHandler.HttpHandler是一个HTTP请求的真正处理中心,在HttpHandler容器中,ASP.NET ...

  7. 【深入浅出jQuery】源码浅析2--奇技淫巧

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  8. 浅析匿名函数、lambda表达式、闭包(closure)区别与作用

    浅析匿名函数.lambda表达式.闭包(closure)区别与作用 所有的主流编程语言都对函数式编程有支持,比如c++11.python和java中有lambda表达式.lua和JavaScript中 ...

  9. iOS网络3—UIWebView与WKWebView使用详解

    一.整体介绍 UIWebView自iOS2就有,WKWebView从iOS8才有,毫无疑问WKWebView将逐步取代笨重的UIWebView.通过简单的测试即可发现UIWebView占用过多内存,且 ...

随机推荐

  1. 微软“.Net社区虚拟大会”dotnetConf2015:关键词:.NET 创新、开源、跨平台

    去年 11 月的时候,微软开源了 .NET CoreFX,然后是今年 2 月份的 .NET CoreCLR.自那时以来,已经有大约 3500 人在 GitHub 上进行了提交,而且贡献者的人数还在持续 ...

  2. 【Java并发编程实战】----- AQS(四):CLH同步队列

    在[Java并发编程实战]-–"J.U.C":CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形.其主要从两方面进行了改造:节点的结构与节点等待机制.在结构上引入了头 ...

  3. React 其实比 MVVM 架构更加卡顿

    React 号称通过引入 Virtual DOM 带来了性能的提升,而其实 React 之所以需要 Virtual DOM,是因为它的架构下,state 的变更是全量的,然后触发 render 返回全 ...

  4. BOM,DOM,ECMAScripts三者的关系

    一:DOM 文档对象模型(DOM)是表示文档(比如HTML和XML)和访问.操作构成文档的各种元素的应用程序接口(API) DOM是HTML与JavaScript之间沟通的桥梁.   DOM下,HTM ...

  5. iOS APP 如何做才安全

    本来 写了一篇<iOS 如何做才安全--逆向工程 - Reveal.IDA.Hopper.https抓包 等>,发现文章有点杂,并且“iOS 如何做才安全”这部分写的越来越多,觉得 分出来 ...

  6. Ajax 提交KindEditor的数据

    这次我是在EasyUI中使用了KindEditor的编辑器,按照官方给的代码,总是无法获取编辑器里面的值(内容),如下:         KindEditor.ready(function (K) { ...

  7. Encountered an unexpected error when attempting to resolve tag helper directive '@addTagHelper' with value '"*, Microsoft.AspNet.Mvc.TagHelpers"'

    project.json 配置: { "version": "1.0.0-*", "compilationOptions": { " ...

  8. 学习SpringMVC——拦截器

    拦截器,顾名思义就是用来拦截的. 那什么是拦截,又为什么要拦截.对于Spring MVC来说,拦截器主要的工作对象就是用户的请求,拦截下来之后,我们可以在拦截的各个阶段悉心呵护[为所欲为].常见的比如 ...

  9. React Native组件介绍

    1.React Native目前已有的组件 ActivityIndicatorIOS:标准的旋转进度轮; DatePickerIOS:日期选择器: Image:图片控件: ListView:列表控件: ...

  10. C#开发微信门户及应用(36)--微信卡劵管理的封装操作

    前面几篇介绍了微信支付方面的内容,本篇继续微信接口的一些其他方面的内容:卡劵管理.卡劵管理是微信接口里面非常复杂的一个部分,里面的接口非常多,我花了不少时间对它进行了封装处理,重构优化等等工作,卡劵在 ...