最近做公司的几个项目,主要以为h5为主,不能实现的功能用oc来写,这样就经常牵扯到oc调用js,或者js调用oc。先插嘴一句,对于目前而言,我对H5包装下的app的用户体验是极其的不满,真的没法和原生比较。对注重用户体验的公司还是比较倾向与混合开发。
根据个人长期摸索,和开发踩过的坑,在这稍微总结一下下。。网上有的基本都很零散,对于开发在使用还需要具体根据项目情况来使用。
oc与js互相调用目前我知道的时主要有4种直接的方式:
1. 苹果的javascriptcore.framework框架;
2.跨平台cordova框架;
3.oc第三方WebViewJavascriptBridge;
4.还有直接就是设置自定义协议,然后在 webView的"- (BOOL) webView:(UIWebView*)theWebView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType"代理里面判断URL协议。便可以间接调用oc.
而通过 - (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script; 方法直接执行一段js代码。
苹果在iOS7中开放了javascriptCore.framework框架;这个框架大大简化了js 和oc 通信。
网上找了好多地方,发现就这篇博客关于avascriptCore.framework写的的最好。javascriptCore.framework很灵活,很强大。内容较多就不说了,看人家写的博客,很不错。
http://blog.iderzheng.com/ios7-objects-management-in-javascriptcore-framework/
可以参考这里学习。
跨平台cordova框架,提供了好多插件,对开发者以js形式提供调用各种原生功能,比如摄像头,罗盘仪之类的本机硬件的。你还可以自己定义插件,通过js调用本地代码。他还可以提供一个打包app。这个呢个人感觉就是适用于以h5为主,原生代码辅助的基础上,一套代码在各个平台上。比较方便不懂原生开发又想省钱的公司。就是目前,用户体验太差,而且cordova文档更新简直太慢,一路学习都是坑。俗话说的“爱一个人让他学习phonegap,恨一个人就让他学习phonegap吧”
参考地址 cordova官网文档:http://cordova.apache.org/docs/en/5.0.0/
oc第三方WebViewJavascriptBridge;这个是封装好的一个oc开源小框架,提供了2套oc和js之间互相调用的方法。这个比较合适混合项目,oc为主的项目。参考见WebViewJavascriptBridge的github上的网址:
https://github.com/marcuswestin/WebViewJavascriptBridge
第四种方法,在 webview的代理里根据自动以URL协议来js调oc, 不是很推介这个,这个必须在这个协议里才可以实现通信,如果多几次调用,里面会出现难以想象个if判断语句,这种很可怕。。
综合以上,鄙人觉得还是使用WebViewJavascriptBridge或者javascriptcore,比较合适混合开发。
假如是以为h5为基础的项目就用cordova。
至于第4种方法,看情况而定了。