WKWebView

一、基本使用


WKWebView的基本使用网上也有很多,这里我就简略的写一下:

引入头文件#import <WebKit/WebKit.h>






















WKWebViewConfiguration和WKPreferences中有很多属性可以对webview初始化进行设置,这里就不一一介绍了。


遵循的协议和实现的协议方法:































下面介绍几个开发中需要实现的小细节:


1、url中文处理

有时候我们加载的URL中可能会出现中文,需要我们手动进行转码,但是同时又要保证URL中的特殊字符保持不变,那么我们就可以使用下面的方法(方法放到了NSString中的分类中):









2、获取h5中的标题 3、添加进度条

获取h5中的标题和添加进度条放到一起展示看起来更明朗一点,在初始化wenview时,添加两个观察者分别用来监听webview 的estimatedProgress和title属性:







添加创建进度条,并添加进度条图层属性:
















实现观察者的回调方法:





















下面是实现的效果图:


效果图-1.gif


3、添加userAgent信息


有时候H5的伙伴需要我们为webview的请求添加userAgent,以用来识别操作系统等信息,但是如果每次用到webview都要添加一次的话会比较麻烦,下面介绍一个一劳永逸的方法。

在Appdelegate中添加一个WKWebview的属性,启动app时直接,为该属性添加userAgent:















这样一来,在app中创建的webview都会存在我们添加的userAgent的信息。


二、原生JS交互


(一)JS调用原生方法

在WKWebView中实现与JS的交互还需要实现另外一个代理方法:WKScriptMessageHandler






在 message的name和body属性中我们可以获取到与JS调取原生的方法名和所传递的参数。


打印一下如下图所示:



JS调用原生方法的代码:









注意:JS只能向原生传递一个参数,所以如果有多个参数需要传递,可以让JS传递对象或者JSON字符串即可。


(二)原生调用JS方法





下面举例说明:


实现H5通过原生方法调用相册


首先,遵循代理:




注册方法名:







实现代理方法:






























我们期望的效果是,点击webview中打开相册的按钮,调用原生方法,展示相册,选择图片,可以传递给JS,并展示在webview中。

但是运行程序发现:我们可以打开相册,说明JS调用原生方法成功了,但是并不能在webview中展示出来,说明原生调用JS方法时,出现了问题。这是因为,在WKWebView中,H5在加载本地的资源(包括图片、CSS文件、JS文件等等)时,默认被禁止了,所以根据我们传递给H5的图片路径,无法展示图片。解决办法:在传递给H5的图片路径中添加我们自己的请求头,拦截H5加载资源的请求头进行判断,拿到路径然后由我们来手动请求。


先为图片路径添加一个我们自己的请求头:




然后创建一个新类继承于NSURLProtocol


.h






.m



























在控制器中注册MyCustomURLProtocol协议并添加对myapp协议的监听:














运行程序,效果如下:


效果图-2.gif


不仅仅是加载本地的图片,webview加载任何本地的资源都可以使用该方法,不过在使用过程中,大家一定要密切注意跨域问题会带来的安全性问题。


猜你喜欢

转载自blog.csdn.net/grl18840839630/article/details/79983928