OC中WKWebView与js的交互

之前用UIWebView的时候,非常的爽,用JSContext这个类就可以做想做的事,现在要改成WKWebView就比较的坑爹了(这是为什么博主要换控件的原因),因为博主需要在页面文件加载之前就把参数给到web端(js调用有返回值oc方法)。把WKWebView的所以代理方法都看了一遍,发现只有下面方式能与js交互:

window.webkit.messageHandlers..postMessage();

但是这个是没有返回值的,于是博主又想到了。如果让web端用这个方法来通知博主这边,再通过博主这边调用web端,这样好像是可以的,但遗憾的是web端通知了博主以后,是不会停止运行的,还是会走下去的,所以当博主再调用web端传参数时,这是没有意义了。后来博主又想到,是不是可以让web端通知博主后阻塞,然后当博主传完参数再执行下去,最后web端童鞋说很麻烦,就没有动了。想了好长一段时间,才想到是不是可以在web端页面加载前,博主就把参数传到浏览器的一个地方,然后web端去浏览器的那个地方取就行了。于是有了下面的写法:

OC中WKWebView与js的交互_第1张图片
要注意的地方是injectionTime,别弄错了
OC中WKWebView与js的交互_第2张图片
WeakScriptMessageDelegate.h文件
OC中WKWebView与js的交互_第3张图片
WeakScriptMessageDelegate.m文件

localStorage这个是网页的本地存储(H5的新东西),相当于iOS的NSUserDefaults,不过大小一般只有5M,这个与浏览器有关。accessToken这个是与web端约定参数key,当然你也可以像下面这样写:

localStorage["accessToken"] = "74851c23358c";
localStorage.accessToken ="74851c23358c";

博主的写法是官方推荐的,反正官方说的,就按照官方的写咯。想了解更多的localStorage的知识,点这里。

PS:如果大家有更好的方法,可以在评论里写出来,或者私信博主,想要demo的点这里。

你可能感兴趣的:(OC中WKWebView与js的交互)