最近看了一下js与oc的相互调用.
1.记得之前在webview中使用js.是使用webview的方法进行调用.
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
...
NSString *jsStr = [NSString stringWithFormat:@"alert('%@')",@"js调取oc弹框"];
[webView stringByEvaluatingJavaScriptFromString:jsStr];
...
return YES;
}
- (void)webViewDidFinishLoad:(UIWebView *)webView {
NSString *jsStr = [NSString stringWithFormat:@"alert('%@')",@"js调取oc弹框"];
[webView stringByEvaluatingJavaScriptFromString:jsStr];
}
注意:上方调取系统弹框会阻塞进程.
上面是使用js调用oc,当然也可以使用它来执行一些js代码.可以使用其他js代码来改变webview中的某些数据啊都可以的.
2.使用JavaScriptCore.它是iOS7之后被添加的.
使用它先添加JavaScriptCore框架.然后导入
#import <JavaScriptCore/JavaScriptCore.h>
最后在webview的协议方法中调取就行了.
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
//获取webview中的js内容
JSContext *context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
NSLog(@"%@",context);
NSString *hiddenHeader = @"window.onload=function(){var head= document.getElementById(\"head\");head.style.display = \"none\"}";
//准备执行的js代码
[context evaluateScript:hiddenHeader];
}
上方代码是使用oc来调用js代码的.
当然也可以使用js来调用oc.比如我们创建一个js方法"test"来进行调用oc代码.
- (void)webViewDidFinishLoad:(UIWebView *)webView {
JSContext *context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
//要调用的方法(此方法创建的是js的方法,只不过是用OC写的)
context[@"test"] = ^() {
NSArray *args = [JSContext currentArguments];
for (JSValue *jsVal in args) {
//打印传来的值
NSLog(@"%@", jsVal.toString);
}
};
//在此处往js方法中传值 -- 然后会在上方block回调打印出来值
NSString *jsValueStr1 = @"test('value1')";
[context evaluateScript:jsValueStr1];
NSString *jsValueStr2 = @"test('value2')";
[context evaluateScript:jsValueStr2];
}