js 具有的快速开发、跨平台、及时更新等的特点,但是用户体验真的差强人意;原生OC开发,开发周期长,更新不便捷等不足,但是良好的用户体验,是不容置疑的。因此,js与OC的混合开发便横空出世。
本人刚接触混合交互,开始也是一头雾水,就总结一下身为小白的个人经验吧,仅以为参考,不足之处,欢迎指出。
首先,在之前实现两者交互是棘手的,但是iOS7之后,苹果推出了JavaScriptCore.framework库(详细关于该库的介绍,可参照这两篇文章:http://justsee.iteye.com/blog/2036713 , http://blog.iderzheng.com/introduction-to-ios7-javascriptcore-framework/ ),使得交互变得容易了很多。
关于交互的理解可参考下面文章:http://www.aiyingli.com/11998.htmlhttp://www.bubuko.com/infodetail-1024567.html
详细的实现交互的细节,可参考以下文章,感觉写的还是很详细的,且提供了详细的demo源码。(我实现js 与oc 交互 的是采用模型的方式):
http://blog.csdn.net/woaifen3344/article/details/42742893
oc与JS交互:http://mp.weixin.qq.com/s?__biz=MzIzMzA4NjA5Mw==&mid=214063688&idx=1&sn=903258ec2d3ae431b4d9ee55cb59ed89#rd
swift与JS交互:http://mp.weixin.qq.com/s?__biz=MzIzMzA4NjA5Mw==&mid=214070747&idx=1&sn=57b45fa293d0500365d9a0a4ff74a4e1#rd
本文的重点就是在说一下刷新网页时js环境丢失,导致不能从js跳进SDK的问题。
我是先建立JS模型:
贴出来NTalkerJSInfoModel.h 的代码:
NTalkerJSInfoModel.h的代码 NTalkerJSInfoModel.m: NTalkerJSInfoModel.m的代码上面的openChatWindow:方法是JS将要调用OC中的方法,即JS中也有openChatWindow这个方法,JS会传进params参数oc会将这些参数以通知的方式传给OC(oc 就可以拿到这些参数该干嘛干嘛就好了),并给JS返回一个int值,js 通过该返回值判断调用结果(返回值这是我们自己的需求)。
然后,我建立一个控制器TestWebViewController,用来打开webVIew:
首先在该控制器中要注册通知监听:
注册监听在openSDKChat中就可以实现自己需要打开OC中方法了。
最后,是本文的重点,我获取当前JS环境的方法一开始是在- (void)webViewDidStartLoad:(UIWebView *)webView 这个代理方法中实现的:
获取当前JS环境但是测试发现,如果没有重新打开一个webView,而是对WeBView进行刷新,或者在同一个webVIew重新打开另一个网址。就会失去JS环境,导致,JS不调用openChatWindow方法,无法调用OC(SDK)中的方法!
我的解决办法是:
在-(void)webViewDidFinishLoad:(UIWebView*)view{}方法中再次获取当前JS环境:
再次获取一遍JS环境不知道这是不是合理的解决办法,但是经测试,刷新网页后,还是能打开SDK,说明问题解决了。
网友评论
主题
配色