前阵子遇到一个项目需要利用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。
算了,下次再写吧。