利用JS 直接调用执行OC代码,非提取URL

来源:互联网 发布:glibc malloc源码 编辑:程序博客网 时间:2024/05/01 18:40

一:

首先导入JavaScriptCore.framework:



二.

在需要JS调用OC方法的.m文件中导入头文件


三.

在OC中进行JS执行环境配置,和指定JS调用的方法的OC代码执行体


四.

这个利用JavaScriptCore.framework框架,使JS直接调用OC代码的实质是:

在JS中定义好方法,在OC中指定执行体;

JS调用的还是JS的方法,而方法的执行体可以由OC代码中编写;


上次忘记附上html跟js文件了,在此附上,供大家参考:

html:

js中定义的方法:


注意点:

1.这是加载本地的html文件时,做的一个demo,至于加载服务器提供的html文件时js调用OC方法,我猜测应该在webView的代理方法

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType

里边做判断 是否加载的request中的URL是那个特定的html,如果是就在此方法中执行步骤三的操作;

2.这与不通过URL让JS直接调用OC方法,并不矛盾;

3.注意OC中定义的block代码块是跟js函数中的submit进行绑定,一定不能错;


关于上边提到的注意点1,笔者亲自实践,发现是不可行的,不过通过笔者苦逼的尝试,终于实现了JS直接调用OC本地方法;

在此在此做出补充:

首先,声明笔者项目开发情景是,加载一个重定向的html时调用执行OC的代码;

其次,方法配置步骤三,笔者测试应该放在webView加载完成的

- (void)webViewDidFinishLoad:(UIWebView *)webView{};监听方法中;

然后在配置完成后,通过OC执行JS中被配置过的JS中的脚本来达到调用OC的目的;



可能有点儿绕,不过细细体会一下还是能自圆其说的吧微笑!!!

特别说明一下,代码中的isLoad是我在

// 监听网页的加载

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;

中通过

拦截到。

网上搜了好久都没有JS直接调用OC(非URL)本地方法特别有用的解决方案,通过自己的实践出不整理出来供大家参考,如果有什么不准确的地方,请大家留言指正,

谢谢。


0 0