关于混合开发,oc与js互相通信的方法总结
最近做公司的几个项目,主要以为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很灵活,很强大。内容较多就不说了,看人家写的博客,很不错。
跨平台cordova框架,提供了好多插件,对开发者以js形式提供调用各种原生功能,比如摄像头,罗盘仪之类的本机硬件的。你还可以自己定义插件,通过js调用本地代码。他还可以提供一个打包app。这个呢个人感觉就是适用于以h5为主,原生代码辅助的基础上,一套代码在各个平台上。比较方便不懂原生开发又想省钱的公司。就是目前,用户体验太差,而且cordova文档更新简直太慢,一路学习都是坑。俗话说的“爱一个人让他学习phonegap,恨一个人就让他学习phonegap吧”
集体怎么弄可以参考看我另外一篇博文:http://www.cnblogs.com/canghaixiaoyuer/p/4713198.html
oc第三方WebViewJavascriptBridge;这个是封装好的一个oc开源小框架,提供了2套oc和js之间互相调用的方法。这个比较合适混合项目,oc为主的项目。参考见WebViewJavascriptBridge的github上的网址:
https://github.com/marcuswestin/WebViewJavascriptBridge
第四种方法,在 webview的代理里根据自定义协议来js调oc, 不是很推介这个,这个必须在这个协议里才可以实现通信,如果多几次调用,里面会出现难以想象个if判断语句,这种很可怕。
其实这个方法就是WebViewJavascriptBridge和cordova中用也有用的的js到oc调用的方法之一,只是经过封装好了以简单的方式提供给开发者。
综合以上,鄙人觉得还是使用WebViewJavascriptBridge或者javascriptCore,比较合适混合开发。
假如是以为h5为基础的项目就用cordova。
至于第4种方法,看情况而定了。
另外在混合开中,如果有模块化的html内容,需要App这边动态的处理这段HTML内容用于展示在UIWebView上。可使用GRMustache或者MGTemplateEngine这2个开源项目。GRMustache是一个类似templateEngine的html渲染工具,可以更加有效的帮助大家完成数据生成HTML的过程。他们的资料都可以在github上有详细说明。
直达地址:https://github.com/groue/GRMustache
其中GRMustache被用在开源中国iOS客户端项目里。大家可以下载参看他们的代码学习下。
无论是GRMustache,还是templateEngine。他们都帮助大家避免了使用
-[NSString stringByReplacingOccurrencesOfString:withString:]:
方法时,繁琐且频繁低效的字符串操作。可以更加优雅高效的生成HTML文件。具体怎么实现就不在赘述。都可以到对应github上学习。在这只是做引导。
大概目前个人就知道先这些,博文中会有错误,肯定还有很多需要学习的地方,希望看到文章的人多给建议,多多学习。