WKWebview 使用总结(个人随笔)
本文只描述WKWebview的使用细节。记录在替换WKWebview进行开发的过程中 所遇到的一些问题。重在记录和探讨WKWebview的数据加载以及如何实现交互。至于WKWebview的基础知识请自行搜索,网上有很多开发者提供。
WKWebview有两个delegate,WKUIDelegate主要用于处理JS脚本,各种弹框等,WKNavigationDelegate主要处理一些跳转、加载处理等操作。来看一下WKWebview最常用的操作,直接上代码!
<1. 设置WKWebview的userAgent
为什么要设置WKWebview的userAgent(浏览器标识),总结了下这哥们的使用场景!
<1> 版本兼容(仅供参考)
首先描述一下使用环境(案例):H5资源包是以压缩包的形式上传至服务器,用户可以请求数据,更新解压至本地。在没有替换WK之前,用户用的是UIWebview加载的数据,替换WK之后,如果用户没有升级App,使用的还是UIWebview。那么将会存在部分用户 App使用WK,另一部分使用UIWebview,此时就要考虑到如何兼容UIWebview和WKWebview。
事实上无论是UIWebview 还是 WKWebview,H5与原生之间的桥梁---交互文件 都可以是同一份,只是两者在发送请求携带参数的机制上 略有不同。WK的如下:
window.webkit.messageHandlers.注册的方法名.postMessage({body:传输的数据} 来给native发送消息。
window.webkit.messageHandlers.SendMessageToNative.postMessage({ "param": param })
H5可以通过userAgent来判断原生执行哪套交互底层方法。其实也可以通过交互获取原生的App版本号(例:version >= 2.0 执行WK底层交互)只是这种方案需要双方交互完成,效率低。而userAgent,H5可以不通过交互直接取到。
<2. WKWebview的交互细节
如果项目使用了WK,交互底层通过以下方式 向原生发送消息 即:
window.webkit.messageHandlers.SendMessageToNative.postMessage({ "param": param })
注意这里的SendMessageToNative和param非常重要。
这里的SendMessageToNative不单单是一个注册方法名,看过一些的demo,里面提到,想要用WK进行交互必须先注册交互方法,例如下面:
原生代码如下:
图1 原生注册了三个交互方法 shake、GoBack、PlaySound
图2 H5通过上图的方式来向原生发送 交互方法名和 交互参数;
图3 原生通过上述代理方法 获取H5发送过来的交互信息。
上图的做法是每个交互 注册一个交互方法,这种方案可行但是 不利于开发和维护。上面说到H5是通过这种方式发送消息 给 原生的。
window.webkit.messageHandlers.SendMessageToNative.postMessage({ "param": param })
这里的SendMessageToNative 是开发者可以随意定义的值。 个人理解 它就是一个可以发送交互信息的原生对象。 我们需要在原生代码里 定义这个对象 负责发送 H5和原生定义好的交互方法名、交互参数等信息 如下:
[configuration.userContentController addScriptMessageHandler:self name:@"SendMessageToNative"];
注册完成后,所有的 交互方法 比如上图中的 shake、GoBack、PlaySound 这个三个交互方法名以及参数 都可以通过 param 直接传递过去。 例如:
window.webkit.messageHandlers.SendMessageToNative.postMessage({ "methodName":"交互方法名" , "param" : "{ "H5传递来的参数" }" )};
这里的SendMessageToNative充当的就是一个信息媒介,之所以记录这个小细节,是因为当时脑袋短路,还以为要注册n多个交互方法, 采用这种方式,我们只需要注册一个发送消息的对象,把 交互方法名 、 交互参数 全部包装在 param里面 发送给原生就行。看看最后原生的处理吧。
图4 我们在获取到H5 传递过来的交互信息时, 要将交互方法名 action 和 交互参数 params 抽离出来, 传递给 一个公共交互类 去处理不同的交互逻辑实现。