我爱编程

记一则iOS封装SDK的开发过程之WebView与JS的交互

2018-05-25  本文已影响199人  lydsnm木鱼凡心

问题 :不显式显示或加载WebView,内部部分内容好像执行不及时。

  近来接触了一个封装sdk的项目,过程中遇到了一些问题,现在空了下来,将这个过程记录一下。
项目主要由<u>iOS封装一个framework静态库,库里面引入由甲方提供的js方法库(一个js文件),原生调用js中的方法,将方法返回值通过原生方法回调会去</u>。相当于一个中间件的功能。

  我首先想到的是通过 UIWebViewWKWebView 来加载js,然后通过javascriptCore和WKWebView自带的方法来处理。这个甲方要求又不要显示html页面,所以使用WebView有点用了牛刀的感觉。查了查资料,没有找到直接能和js文件交互的方法,无奈还是采用了WKWebView。

  由于wkwebView是iOS8以后推出的新框架,故而一开始就使用使用了wkwebview。当对应的html、js到位后,发现js中的回调很奇怪,原生偶尔可以得到回调,猜测可能js方法库中方法太过繁忙,从而导致消息堵塞进而丢失掉。经过延时的操作,发现并不是这个问题。

  正如之前说的,项目并不需要展示webView,html中的内容也不需要展示。而需求是提供.framework,不可能头文件提供一个webView给开发者,添加到对应的界面上吧。因此做了一个小尝试,快速改换成了UIWebView,相应的js方法,和调用方法,以及回调方法改了下来测试。发现可以正常使用。这下得出结论WkWebView如果没有正常显示的话,内部有种“惰性”的感觉,某些js方法执行和回调很“迟缓”,往往点几次才会响应。

  研究到这,应该是换成UIWebView了。但是抱着不甘心,多查了些资料,和试验了几波,是真的因为那个原因吗?不多说了,总结了下我的两个解决方法:

最终解决

1.使用UIWebView

js中使用下面的代码回调原生

bclMiddlecallback(callbackScheme, callbackPath); 

UIWebView可以不加在任何View上,也可以设置.hidden = YES;

2.继续使用WKWebView

js中使用下面的方法回调原生

 window.webkit.messageHandlers.bclMiddlecallback.postMessage(callbackScheme + callbackPath); 

!!!WKWebView必须加在某个View上,内部一些机制才能正常运转、回调才能正常发生。.hidden设置或者不设置不影响。

所以:

WKWebView *wkWebView = [[WKWebView alloc] initWithFrame:CGRectMake(0, [[UIScreen mainScreen] bounds].size.height, 320, 480) configuration:configuration];
_wkWebView = wkWebView;
[[[UIApplication sharedApplication] windows].firstObject addSubview:wkWebView];
wkWebView.hidden = YES;

收工!


如果你也遇到此问题,如果你有新的想法请联系我:dongigndao@163.com

上一篇下一篇

猜你喜欢

热点阅读