- OC调用JS
方法一(常用)
利用WebView的stringByEvaluatingJavaScriptFromString方法调用JS代码
//调用JS的callJS方法,并且传入param参数,这里要注意参数使用的是单引号‘’
NSString *js = [NSString stringWithFormat:@"callJS('%@')",param];
//把JS传入WebView的运行环境中
NSString *string = [self.webView stringByEvaluatingJavaScriptFromString:js];
方法二
利用系统框架<JavaScriptCore/JavaScriptCore.h>的JSContext 类的evaluateScript调用JS的方法
//获得WebView的运行环境的对象
JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
//调用方法(注意:这里是JS里面的定义的方法),同样参数也是用单引号''括起来
NSString *callJSstring = @"sendJSString('参数')";
[context evaluateScript:callJSstring];
- JS调用OC
方法一
通过加载WebView的时候截取URL的方式来进行交互,之前一直是用的这种方法,感觉比较麻烦
在UIWebView的代理方法中进行拦截
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
// 方法一:直接通过request.mainDocumentURL.relativePath
QSLog(@"%@", request.mainDocumentURL);
QSLog(@"%@", request.mainDocumentURL.relativePath);
// 方法二:按照url中的分隔符来对url进行分割
NSString *urlString = [[request URL] absoluteString];
urlString = [urlString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSArray *arrFucnameAndParameter = [urlString componentsSeparatedByString:@"/"];
NSString *subStr = arrFucnameAndParameter.lastObject;
// 最后通过判断来做一些处理
}
方法二
应用系统框架<JavaScriptCore/JavaScriptCore.h>
此方法的重点是取到UIWebView的JS执行环境,并且OC代码必须在主线程中执行
// 拿到WebView执行JS的执行环境,很重要的东西
JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
1、block的方式
// 拿到WebView执行JS的执行环境,很重要的东西
JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
// 无参数,jstoocNoPrams是JS的方法名称
context[@"jstoocNoPrams"] = ^(){
// 调用方法处理内容
NSLog(@"点击了没有传参数按钮");
dispatch_async(dispatch_get_main_queue(), ^{
// 执行OC代码
});
};
// 有参数 ,jstoocHavePrams是JS的方法名
context[@"jstoocHavePrams"] = ^(){
// 调用方法处理内容
// 获得参数数组
NSArray *prams = [JSContext currentArguments];
NSString *arraySting = [[NSString alloc]init];
for (id obj in prams) {
NSLog(@"====%@",obj);
arraySting = [arraySting stringByAppendingFormat:@"%@,",obj];
}
dispatch_async(dispatch_get_main_queue(), ^{
// 执行OC代码
});
};
2、JSExport协议方式
- 首先:自定义协议,并且协议遵守<JSExport>协议
并且定义协议方法(就是JS调用的OC方法)
@protocol QSJSExport <JSExport>
- (void)JSCallOC;
@end
- 然后,在加载WebView之后注册协议
- (void)regiseterProtocol
{
JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
//change类似于JS里面的标识(change字符是自定义的,只要和JS中得一样就可以)
[context setObject:self forKeyedSubscript:@"change"];
}
- 最后时限协议方法就行了
- (void) JSCallOC
{
NSLog(@"JSCallOC");
}
非常感谢崖边树写的两篇文章,以上内容基本都摘抄自他的文章内容
【JS与OC交互大总结之一 JS调用OC】
【JS与OC交互大总结之二 OC调用JS】