以前在项目中很少用到OC和JS交互,所以对这方面没有进行更加深入的了解,最近公司安排的一个项目;一半的内容是用h5写的;所以在这个过程中需要OC和JS进行无缝对接,互相频繁调用。在做的过程中出现了一些问题,这里总结出现,希望能给大家一些启示。
创新互联公司坚持“要么做到,要么别承诺”的工作理念,服务领域包括:网站建设、网站制作、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的恩施土家网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
一.在webview中如果项目只是想简单用一下js和oc进行交互,就没有必要搞的那么麻烦,只需要用下面的方式进行处理就行.
1.oc调用js;例如,在js中有一个叫commit的方法,在oc中咱们可以这样来调用它
如果你调用的js函数需要传入参数,也不要紧,咱们只需要通过字符串拼接的方式将参数传入即可。比如当前有一个叫sum(a,b)的js函数,在oc中咱们可以这样来调用它---(注意:在内部参数要用' '来将参数括起来,这是因为html函数传参方式跟oc的不同,我们必须要按照html的传参方式传入才会有效果)
2.js调用oc;以前js调用oc是通过在webview这边拦截js那边触发的http请求的url地址来判断是不是我们需要调用的时机,然后再调用的oc。如果当我们在webview上点击一个按钮的时候他会跳转到这个页面,那么我们在oc这边就可以通过拦截这个地址做一些事情
二.其实,通过上面的方法是可以达到js和oc之间进行通讯,但是它也是存在一些弊端,或者说有时候不是很方便的。在ios7以后苹果官方将javascriptCore框架给开放出来了,我们这个通过这个框架就可以畅通无阻的让js和oc之间进行相互调用了。
1.通过javascriptCore来进行js和oc互相调用。第一步就是要进入javascriptCore这个框架.
之后就可以在需要使用的控制器中导入javascriptCore框架了,并且如果你需要js来调用oc,并且在js中的触发函数是native.submit(a,b)类型的,那么你需要将js方法和oc方法进行关联,这样处理以后,调用js对应的方法就会触发oc对应的方法,当然,JSContext对象也是必须的,这个对象是js和oc关联起来的工具,所有的js和oc调用都需要通过它来完成。
然后在webViewDidFinishLoad:中我们需要进行下面的步骤,关联native方法,是在当js方法中有native.submit()类型函数的时候才需要绑定的,如果没有这种类型的就不需要绑定。
注:其实通过上面的方法把self.context的native方法跟self绑定是会发生很严重的内存泄露问题的。因为这样会造成self被相互持有,导致该对象无法被释放,解决方案是native指定一个新的对象,然后在指定对象里实现JSExport协议。
接下来就是非native.submit()形式js触发函数调用oc的方式,我们这边可以用block形式关联javascript function.
通过上面的调用方式就可以获取到js调用时给oc传过来的参数,然后再进行相关处理.当js那边是native.类型的函数的时候,js调用oc,我们就可以直接拿到js跟oc绑定的那个方法来进行处理。
到此,js和oc之间相互调用的内容就差不多了,但是在使用的过程中有些情况下会发生莫名情况的野指针的情况 ,直接导致程序的崩溃。这个问题我是在webview中调用手机摄像头拍照上传的过程中发现的,具体流程是当需要上传图片的时候js调用oc的方法,然后oc进行拍照并且上传,当上传图片成功以后,再通过oc调用js通过js去回显图片,就是在回调js的过程中有时候就会发生莫名其妙的野指针崩溃,暂时我还没找到能够彻底解决这个问题的办法,等找到相关方法,我再进行公布。
续:之前在webView中频繁使用js和OC互相调用,出现了野指针问题,那么这个问题现在解决了。具体做法就是我们拿到webView所在的线程,让你要执行的方法在webView所在线程中执行。例如:
通过上述方法就可以避免野指针问题,但是具体是因为什么原因造成野指针问题的,我还没弄明白,希望知道的高手指教。
分号加与不加完全取决于个人习惯,但为了代码稳定(解析出错)还是建议使用分号断句。
JavaScript自动加分号规则:
1.当有换行符(包括含有换行符的多行注释),并且下一个token没法跟前面的语法匹配时,会自动补分号。
2.当有}时,如果缺少分号,会补分号。
3.当程序源代码结束时,如果缺少分号,会补分号。
结论:
1.在return、break、continue、后自增、后自减五种语句中,换行符可以完全替代分号的作用。
2.var if do while for continue break return with switch throw try debugger几种关键字开头的语句,以及空语句,上一行加不加分号影响不大。
3.凡表达式语句和函数表达式语句,后面不加分号非常危险,情况极其复杂。
4.凡(和[开头的语句,前面不加分号极度危险。
好吧,电源绝对被坑大发了,网上航嘉500W的电源才350块左右.......显卡可以这个价位入手,但是就是不知道这块卡是不是翻新的,如果全新的这个价位还是值得的。建议把CPU换了,这么高端的CPU完全没必要啊,上块I3-3220就够了而且我觉得4400的价位弄套这样的配置性价比不是很高诶。
所以总的来说你被奸商坑大了!
售后响应及时
7×24小时客服热线数据备份
更安全、更高效、更稳定价格公道精准
项目经理精准报价不弄虚作假合作无风险
重合同讲信誉,无效全额退款