OC中与JS之间交互有两种方式,第一种是在webView的代理方法中拦截网页插入JS代码达到效果:
#pragma mark - UIWebViewDelegate
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
NSURL * url = [request URL];
if ([[url scheme] isEqualToString:@"test"]) {
return NO;
}
return YES;
}
这是一种老的方式,之前的很多三方库都是这样事项的,像 WebViewJavascriptBridge;
这里着重说一下第二种方式,iOS7之后apple添加了一个新的库JavaScriptCore,用来做JS交互,因此JS与原生OC交互也变得简单了许多。
这是一个简单登录界面
写两个用到的JS方法
function getValue(){
var phoneNum = document.getElementById('phoneNum').value;
var passWord = document.getElementById('passWord').value;
test1(phoneNum,passWord);
}
function setValue(obj){
document.getElementById('phoneNum').placeholder = obj;
document.getElementById('passWord').placeholder = obj;
}
获取JS传过来的值
- (void)webViewDidFinishLoad:(UIWebView *)webView{
self.context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
self.context[@"test1"] = ^(){
NSArray * args = [JSContext currentArguments];//传过来的参数
NSString * name = args[0];
NSString * str = args[1];
NSLog(@"--%@--%@",name,str);
};
}
OC给JS发送消息
- (void)viewDidLoad {
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"调用" style:UIBarButtonItemStyleDone target:self action:@selector(setValueToJS)];
}
- (void)webViewDidFinishLoad:(UIWebView *)webView{
self.context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
}
- (void)setValueToJS{
NSString *setValueJS = @"setValue('123')";
[self.context evaluateScript:setValueJS];
}