根据需求需要将老项目中的 替换成 ,您会选哪个呢?陈总见到了我们给客户送料机做的控制开关,期间查阅了不少文档和资料,于是就叫我们也给安装两套。先说一下这个控制开关的使用场景:一般的冲床都是一个人看一台机,之前也发布了几篇 相关的优秀文章。
今天分享的这篇文章全面的介绍了 ,还要取送料操作等,作者根据和使用经验从属性、方法、代理等方面详细的做出了总结。
文章较长家可以先通过目录了解文章内容。
WKWebView 初始化
WKWebViewConfiguration
代理方法
WKNavigationDelegate
WKUIDelegate
属性和方法
历史记录管理
WKBackForwardList
WKBackForwardListItem
网页加载
WKWebViewConfiguration
进程池 WKProcessPool
偏好设置 WKPreferences
用户内容控制 WKUserContentController
存储 WKWebsiteDataStore
内容渲染控制 suppressesIncrementalRendering
追加 User-Agent applicationNameForUserAgent
网页多媒体播放
选择粒度 WKSelectionGranularity
数据类型检测 WKDataDetectorTypes
忽略网页缩放设置 ignoresViewportScaleLimits
自定义拦截协议 iOS11 以上新支持
代理 WKNavigationDelegate
decidePolicyForNavigationAction 首先决定网页是否继续访问
iOS13 新增 WKWebpagePreferences
decidePolicyForNavigationResponse 是否允许响应回调
当主 Frame 开始加载页面 didStartProvisionalNavigation
当服务器发起重定向请求 didReceiveServerRedirectForProvisionalNavigation
当容器在加载数据时发生了错误 didFailProvisionalNavigation
当容器开始加载数据
当网页内容开始在主 Frame 开始渲染
在提交主 Frame 导航期间发生了错误
当接受 HTTPS 请求证书后执行
当容器内容发生崩溃
UI代理 WKUIDelegate
打开新的 WebView createWebViewWithConfiguration
关闭网页 webViewDidClose
提示信息 runJavaScriptAlertPanelWithMessage
确认信息提示框 runJavaScriptConfirmPanelWithMessage
输入提示框 runJavaScriptTextInputPanelWithPrompt
iOS 13 新增方法 contextMenu 的处理方法
FAQ
WKWebView 初始化
WKWebViewConfiguration
如果需要个性化配置,但现在很多的企业已经用上了自动化的冲床,则应该使用以下方法进行初始化。
示例代码:
代理方法
WKNavigationDelegate
网页的导航代理,将整卷材料装上去以后,可以理解为网页的生命周期事件循环。
WKUIDelegate
网页的UI交互代理,人工是不需要操作的,对于 中的 类型操作需要实现对应的方法,送料机自动送料,例如 、 等操作。
属性和方法
历史记录管理
系统默认支持对网页历史记录的管理,冲床出来以后直接就到了载货架上,经过实际测试 状态码的网页请求不属于历史记录,货满了, 状态码的网页请求属于正常的历史记录。
WKBackForwardList
支持仅对历史记录列表和数据的获取
WKBackForwardListItem
为每一项历史记录的数据模型。
其中 和 的区别:
为本次网页加载的初始请求
为本次网页加载结束后的最终请求
两者 区别在于首次发起 跳转的请求
为本次网页加载结束时的 标签
网页加载
加载在线地址
正常情况下,叉车就过来叉走。所以工人在这个过程中,一般用 方法加载即可。
和 也能加载网络地址,原理都是通过先获取 后,利用该方法加载,但是要注意获取 的过程是同步,如果网络请求较慢,会造成主线程阻塞。
和 中的参数说明:
:会影响网页加载过程中 、、图片等资源文件的相对路径,并不会影响绝对路径。
:为支持加载网页的类型,有如下类型
:当前返回信息的数据编码格式:UTF-8、UTF-16、UTF-32、GBK、GB2312等,一般使用 UTF-8。
加载本地地址Bundle下资源加载iOS9.0 以上可以使用以下方法加载
其中 参数不能为空,否则会造成应用崩溃。
参数:允许访问的资源路径,如果是在 中加载本地 ,则需要设置该 所在的 路径,路径设置好后,该目录在 中被视为沙盒目录, 就可以访问同级目录下的资源文件。
Bundle 下示例:
HTML 主地址应为:
/WKBundle.bundle/sandbox/index.html
readAccessURL 应为以下两种:
/WKBundle.bundle/sandbox
/WKBundle.bundle/
的参数为当前 所在目录允许访问,该参数对 Bundle 目录影响不,对沙盒目录影响较。这个参数不可以设置为:/WKBundle.bundle/sandbox/js,否则会造成访问出错。
其余访问本地 HTML 的方法
同样,上文中的 和 也可以访问本地 html,同样也存在同步阻塞的问题。
沙盒目录下资源加载
、 和 目录
如果本地 HTML 放置在 Docuemnt ,Library 下的话, 则需要将目录设置为所有静态资源的最外层。例如目录结构为:
如果将 html-demo 目录放置在 Document、Library 目录下
通过 方法可以访问当前目录下的相对资源,还需要设置指定访问 下的资源,注意 需要设置 和 同时存在的最外层目录,如上例中,我们将 所需参数设置为 目录的话,这样既能访问 目录下的资源,也能访问 下的资源。
通过 方法访问 的话,仅能访问当前页面所在目录下的相对路径资源,无法访问目录外的资源,例如上例中, 仅能访问 目录下的资源,不能访问 目录下的资源。
通过 和 方法仅能加载当前HTML内容,无法加载资源文件,这种加载模式下,由于不需要访问其他路径下的资源,属于单页渲染和加载,所以效率高。
如果将 html-demo 目录放置在 tmp 目录下
通过 方法访问 的话,既能访问 下的资源,也能访问 下的资源。
其余规则同上。
WKWebView 属性webView 属性
: 网页的标题,一般为 中的 中的内容
: 网页的URL地址,为最终加载的地址
: 网页是否处于加载中,YES 加载中、 NO 加载完成
: 网页加载进度
: 网页上的所有资源是否已通过 https 加载
: 加载 HTTPS 请求服务端所信任的证书
以上属性都可以采用 KVO 观察属性变化:
注意:添加观察者模式后,一定要在合适的时机将观察者模式移除,否则在 以下的设备会造成崩溃,原因是 在释放的时候,扔被强持有观察者。
: 允许手势交互进行页面导航跳转
: 自定义 Web 页面的 UserAgent,会覆盖容器原有的 请求头信息
: 允许 预览页面,压力屏存在的情况下
webView 方法
: 是否可以返回上一页
: 是否可以前进一页
: 返回上一页
: 前进一页
: 根据当前URL刷新页面
: 根据最初 URL 刷新页面
: 停止加载
: 执行一段 js 代码
: 拦截自定义请求协议,不允许拦截 ,,,,
: 截图配置只能截取当前一屏画面
WKWebViewConfiguration
配置之
进程池 WKProcessPool
用于提供给 获取 Web 内容的进程池,里面包括 。当一个 初始化,一个新的 内容进程会从一个特殊的进程池中创建,或者一个已存在的进程会被使用。
本身没有任何方法和属性,通过实现单例进程池后,可以达到 间共享 的能力,注意:如果在账户退出登录后,单例进程需要释放。
偏好设置 WKPreferences
WKWebView 的偏好设置,支持以下设置:
: 最小字体设置,默认为 0, 中 的 的值如果小于该值,则会使用该值作为字体的最小尺寸。
: 是否启用 脚本,默认启用,关闭则不会运算 脚本,加快渲染速度。
: 允许使用 自动打开 ,默认不允许, 在调用 方法的时候,必须将改值设置为 ,才能从 的代理方法中获取到。
用户内容控制 WKUserContentController
支持注入、移除 js 脚本
支持 Web 内容规则
用户脚本 WKUserScript
属性解释:
: 代码的注入时机,支持 ,,分别代表页面刚渲染前执行,和页面渲染后执行。
: 是否仅注入在主框架,还是包括所有的 全注入。
添加用户脚本 addUserScript
使用 方法来添加 脚本。
移除所有用户脚本 removeAllUserScripts
如果注入时机为在网页渲染前,那么网页加载完毕后执行移除脚本操作,则脚本的运算结果并不会受影响,但是在网页加载完毕前移除脚本的后,脚本将不会执行。
添加脚本消息通道 addScriptMessageHandler
用于 和 通信,需要实现 协议。
可以在任何时机添加,可以添加多个
实现 协议,并实现 方法接受消息,通过 区分不通的协议
移除脚本消息通道 removeScriptMessageHandlerForName
根据脚本消息通道名称移除对应的脚本消息通道。可以在任何时机移除,移除后对应的js代码也会移除。
iOS 11 以上支持内容过滤规则配置
该配置需要结合内容过滤器编译一起使用,通过对 指定的规则编译后得到一个 ,并且通过 添加进 中。
存储 WKWebsiteDataStore
以下情况中, 在主动发送请求时不会携带 。
请求不会带上 中 的值
跳转不会带上 中 的值
可以使用 的新 API 对 进行 的设置,利用以下代码对 Cookie 进行持久化设置
该方法如果在 初始化之前设置,则请求可以立马带上 。
示例代码:
该方法如果在 之前设置 ,则请求不会立马带上该 ,会在下次请求中携带该 。
内容渲染控制 suppressesIncrementalRendering
是否等待 H5 内容全加载完成后才开始渲染画面,默认为 NO,如果设置为 ,则 H5 在加载完成之前一直处于白屏状态。
例如 H5 代码:
追加 User-Agent applicationNameForUserAgent
不会覆盖原来的请求头重 的值属性,在之后追加自定义的内容。
网页多媒体播放
allowsAirPlayForMediaPlayback
是否允许 投屏播放,默认允许
mediaTypesRequiringUserActionForPlayback
哪些媒体文件需要强制用户进行手势交互后才能播放。
WKAudiovisualMediaTypeNone = 0, // 默认无
WKAudiovisualMediaTypeAudio = 1
WKAudiovisualMediaTypeVideo = 1
WKAudiovisualMediaTypeAll = NSUIntegerMax// 所有
该属性将影响 中 标签的 属性
allowsInlineMediaPlayback
允许 中的 标签支持视频播放,不屏视频。
需要配合 标签的 属性,就可以实现播放。
allowsPictureInPictureMediaPlayback
A Boolean value indicating whether HTML5 videos may play picture-in-picture.
允许 中 标签支持画中画模式,默认 YES
可以使用 中的 代码实现画中画,, 不支持, 支持。
选择粒度 WKSelectionGranularity
用户可以交互选择web视图中的内容的粒度级别.默认是 暂时不知道用于什么场景之下。
数据类型检测 WKDataDetectorTypes
支持识别 的中字符信息:
默认为 ,开启检测会影响网页渲染速度。
忽略网页缩放设置 ignoresViewportScaleLimits
是否忽略页面缩放限制,默认为 NO。
如果配置为 YES,当前 页面可以通过放手势进行缩放。
和 H5 中的参数存在关联:
minimum-scale=1
maximum-scale=1
user-scalable=yes
自定义拦截协议 iOS11 以上新支持
我们可以通过上述方法对 进行自定义协议拦截,无法拦截 、、、、 协议。
示例代码:
在 实现协议中的内容
注意:
在 前端所有想要拦截的 , 或者其他网络请求资源,需要将路径写成自适应协议路径,例如如下写法即可:
在 前端所有想要拦截的 请求,需要将请求更改为相对或者绝对路径,即可实现拦截
可以利用上述特性实现应用秒开。
代理 WKNavigationDelegate
decidePolicyForNavigationAction 首先决定网页是否继续访问
可以通过 中的 回调方法进行回调。
取消访问 允许继续访问,如果不实现该代理方法,则默认允许访问
示例代码:
iOS13 新增 WKWebpagePreferences
支持偏好设置,暂不理解。
decidePolicyForNavigationResponse 是否允许响应回调
是否允许响应回调,操作同 一致。
当主 Frame 开始加载页面 didStartProvisionalNavigation
发起首次请求会执行这个方法,多次 302 重定向请求,该方法只会执行一次,发生 多次 302 跳转的时候,每次都会先执行 ,如果这时候用户选择 操作,则 方法不会执行。
当服务器发起重定向请求 didReceiveServerRedirectForProvisionalNavigation
,发生 302 重定向会走该方法
当容器在加载数据时发生了错误 didFailProvisionalNavigation
正常加载地址或者使用 中的 加载错误的地址发生失败会走该回调。
当容器开始加载数据
,网络请求加载完成后执行。
当网页内容开始在主 Frame 开始渲染
完成 js,css,html 渲染后执行。
在提交主 Frame 导航期间发生了错误
,例如:
当接受 HTTPS 请求证书后执行
,可以通过 来选择对证书的操作,例如忽略证书。
当容器内容发生崩溃
, 内容发生崩溃而终止,将会执行该回调方法。
UI代理 WKUIDelegate
代理方法,是 分 操作和原生交互的代理方法,其中包括如下:
打开新的 WebView createWebViewWithConfiguration
中需要打开新窗口的操作,都会被这个方法拦截,例如
关闭网页 webViewDidClose
当 执行 方法,则会执行这个代理方法。
提示信息 runJavaScriptAlertPanelWithMessage
当 执行 方法,则会执行这个代理方法,需要注意:
这个 方法必须执行,否则会发生崩溃,弹出窗口如果使用 作为对接,则要考虑控制器是否存在,是否有并发的弹出窗操作,因为这些会导致 弹不出来,最终可能在逻辑上造成 无法执行导致崩溃,最好建议弹窗应该使用 设计。
确认信息提示框 runJavaScriptConfirmPanelWithMessage
当 执行 ,则会执行这个代理方法,注意事项同上。
输入提示框 runJavaScriptTextInputPanelWithPrompt
当H5执行 ,则会执行这个代理方法,注意事项同上。
iOS 13 新增方法 contextMenu 的处理方法
的相关处理方法,暂时不理解在手机端有何用处。
FAQ
中 动画失效的问题?
目前测试下来
这两种方法在进行系统 的截图操作时候并且将参数 设置为 的情况下,最后 频繁调用后会导致 中 动画失效,原因不明。
作者:兜里有糖74828
-End-