JS调用OC的理解与总结"/>
JS调用OC的理解与总结
首先声明,在这里我只是谈谈对JS调用OC方法的两种方式的理解,并不涉及具体实现,
至于实现的代码网上可以搜到很多。我认为学习任何东西,对概念的理解是应该放在首位的,
有些东西你“吃不透“,主要还是没理解它的概念的缘故。
一.
通过URL截取来调用OC方法:
这种方式中,JS进行跳转的URL可以看成是为OC在JS中注册了一个方法,相当于OC中对应方法的声明。
而OC中通过截取URL获得方法名跟参数,对注册的方法进行实现;
最后在OC中通过perform:selector 调用实现的方法;
总结此方法的整个流程是:JS注册方法名及参数(如果有的话),将方法名跟参数传递给OC,OC实现注册的方法,OC调用OC方法,
其实质还是OC调用OC方法,只不过重要的是JS传递过来的参数,可能是我们所需要的。
由于是在OC中通过perform:selector调用的方法,方法名都是次要的,笔者觉得在OC中定义一个跟URL具有相同多个参数的方法都是可行的。
该方法中URL会有两个方向的用处:(1)可以不进行页面跳转,而只是单纯的触发或者说调用OC中实现的OC方法;
(2)进行跳转,同时执行OC中实现的方法;
二.
JS直接调用OC中的方法;
我之前有发过一篇有关这种方式帖子,具体讲解的实现过程,具体细节可以参看那一篇博文。
之前我的项目的需求是:进行页面跳转时JS触发一个方法,比如paySuccess(),以此来调用OC中的方法,JS中只是注册了一个paySuccess的方法,
它的函数体是空的;当js触发该方法时执行的是 OC中通过对js中context属性进行配置, 而得到的“函数体”。
这个过程由于是动态的页内跳转,所以需要实现WebView的代理方法对网页加载进行监听,通过尝试发现OC对JS方法进行配置的时间切入点是关键;
因为动态加载网页时,OC的配置如果在网页还没有加载完成时配置,由于JS对方法的注册还没有完成,所以不会成功;
如果加载完成之后进行配置,由于网页在加载完成的瞬间会自动触发paySuccess(),而如果我们在webView的加载完成的代理方法中进行配置,开始配置之前其实
paySuccess()方法已经出发了,所以也是失败的。
后来笔者在上边步骤的接触上,在配置完成后通过OC调用JS的方法主动执行JS中触发paySuccess()的时候,结果竟然成功了。
花了这么多口水讲述了我的代码的整个实现的过程,主要是想有利于读的人能很好的理解其中的奥妙。
相信仔细体会,能给大家带来很大收益。
最后说一下JS直接调用OC中的方法的大概流程:
首先js中定义一个具有空的函数体的方法 function paySuccess{logout()};
然后在OC中对JS中的context[logout]=^{ 配置需要执行的OC 代码 };
最后通过[webViewstringByEvaluatingJavaScriptFromString:@"paySuccess();"];
触发JS方法,调用OC中的代码。
通过上边的具体阐述,相信能让大家对JS调用OC中的方法,或者更准确的说执行OC中的代码,能有一个清晰的掌握。
更多推荐
JS调用OC的理解与总结
发布评论