浅谈JS与OC互相调用以及注意事项

前阵子遇到一个项目需要利用JS与OC交互,一时搞得手忙脚乱,在网上查了不少资料才终于入门。在此记录一些经验以后以后参考。因为只是入门级的水准,所以如果有错误欢迎指出。

当把网页用UIWebView加载出来并嵌入App里时,难免需要让JS与OC互相调用,而从iOS7开始,JavaScriptCore.framework被苹果公司公布以后,JS与OC的交互就更加方便了。

 

一、用OC调用JS。

1、在使用JavaScriptCore.framework这个框架前,我们先要进到项目中的Build Phases中的Link Binary With Libraries添加JavaScriptCore.framework。

2、然后在你需要用到OC调用JS的类中导入头文件,也就是#import <JavaScriptCore/JavaScriptCore.h>

3、接下来我们需要让OC调用JS,那么我们必须先创建JSContext 对象(即通过当前webView的键获取到jscontext) ,所以我们需要这样实现webView代理方法(当然在此需要先遵守UIWebViewDelegate协议

-(void)webViewDidFinishLoad:(UIWebView *)webView {

  JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];  //通过webView键创建JSContext对象

    NSString *alertJS=@"alert('Hello JS')";//这是利用OC调用JS所执行的命令

  [context evaluateScript:alertJS];//通过oc方法调用js的alert   

}

我们来分析一下这段代码的执行流程,在webView页面加载完成以后,OC会通过webView的键创建JSContext的对象,然后通过evaluateScript调用JS执行alert('Hello JS')这个代码,即会在webView加载的页面中弹出提示框提示Hello JS,如此就完成了一次简单OC调用JS的流程,非常简单。

在此有个注意事项,不论是通过webView键或取jscontext创建JSContext或是后面调用js都必须写在页面加载完成以后,即-(void)webViewDidFinishLoad:(UIWebView *)webView ;这个方法执行中或者以后,也就是说无论是

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

-(void)webViewDidStartLoad:(UIWebView *)webView 内都无法正确创建JSContext对象,更别说调用JS了,这个需要注意一下。

 

二、用JS调用OC。

算了,下次再写吧。

posted @ 2016-05-21 23:20  Char已存在  阅读(873)  评论(1编辑  收藏  举报