问题 :不显式显示或加载WebView,内部部分内容好像执行不及时。
近来接触了一个封装sdk的项目,过程中遇到了一些问题,现在空了下来,将这个过程记录一下。
项目主要由<u>iOS封装一个framework静态库,库里面引入由甲方提供的js方法库(一个js文件),原生调用js中的方法,将方法返回值通过原生方法回调会去</u>。相当于一个中间件的功能。
我首先想到的是通过 UIWebView 或 WKWebView 来加载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
网友评论