WKWebView是苹果从iOS8.0开始推出的,用于取代UIWebView,现在已经被广泛的使用,WKWebView提供了更多的API以供和html进行交互,总的来说,提供两种方式来和html进行数据交互。(WKWebViewDemo)
1、WKWebView的加载,如下图:

从上图可以看到,WKWebView的代理有两个,UIDelegate的代理方法是用来和iOS原生进行UI方法的交互,navigationDelegate代理方法主要是和原生交互页面的加载、跳转、认证等。
2、WKWebView也是可以通过navigationDelegate的代理方法hejs方法进行交互,如某些js方法的拦截,如下图:

2、iOS原生调用WKWebView方法,进行参数的传递。如下图:


此处,需要注意的是,WKWebView执行js代码传入数据时,必须要在navigationDelegate下面代理方法执行后,才能执行js相关代码。

还有一种情况,调用js传入JSON字符串参数时,需要小心了,如果此时的JSON字符串中含有空格或换行符,那么,html中是无法接受到参数的。如下图:

控制台会报一个‘A JavaScript exception occurred’的错误,具体如下图:

所以,原生调用js方法时,如果传入的参数是JSON字符串时,一定要去掉JSON字符串中的空格和换行符。
3、通过MessageHandler的方式和html进行通信,首先需要遵守协议WKScriptMessageHandler,然后通过userContentController属性,进行方法的添加,具体代码如下:

然后,在WKScriptMessageHandler的代理方法中,就可以接收到html对原生方法的调用及传递的参数,如下图:

通过MessageHandler的方式进行和html间的通信时,会产生循环引用的问题,具体循环引用为:self - webView - configuration - userContentController - self,因此,必须要打破该循环引用,打破方式如下:

注意,addScriptMessageHandler和removeScriptMessageHandlerForName一定要成对出现,不然就很容易造成内存泄漏。
总结:上面是WKWebView中经常使用的方法,以及在使用过程中需要要注意的一些事项,关于WKWebView的cookie丢失等问题的解决会在稍后的文章涉及。欢迎广大iOSer指教。
网友评论