JS与OC的交互方式有三种:
1.UIWebviewDelegate
2.JavaScriptCore
3.WebViewJavascriptBridge
本文主要介绍第二种交互方式
第二种对于一些交互事件较少的点击事件,通过UIWebviewDelegate的代理方法进行拦截,获取服务器定义好的事件类型(或者方法名称等),进而进行相应的操作。
1、首先介绍一下获取
JSContext中的js参数方法的封装(需要导入库
<JavaScriptCore/JavaScriptCore.h>)
/*
参数说明:
webView :要进行JS交互的网页
urlStr :本网页的网址url
paramStr : 与后台交互的标示
finished :block回调,成功后返回我们需要的数组valueArr
*/
+(void)webViewLoadHtml:(UIWebView *)webView htmlReuqstUrlStr:(NSString *)urlStr paramStr:(NSString *)paramStr isFinishedRequest:(void (^)(id))finished{
JSContext *content=[webView valueForKeyPath:
@"documentView.webView.mainFrame.javaScriptContext"];
content[paramStr]=^(){
NSArray *args = [JSContext currentArguments];
NSMutableArray *valueArr=[NSMutableArray new];
for (JSValue *jsVal in args)
{
NSLog(@"--jsVal=%@",jsVal);
[valueArr addObject:jsVal];
@try {
}
@catch (NSException *exception) {
}
@finally {
}
}
if (finished)
{
finished(valueArr);
}
};
}
2、在webview代理方法中获取交互需要的数据
#pragma mark -
#pragma mark webview delegate
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
[HtmlRequestModel webViewLoadHtml:_DetailWebView htmlReuqstUrlStr:urlStr paramStr:@"axd" isFinishedRequest:^(id valueArr) {
NSLog(@"valueArr=%@",valueArr);
type=[valueArr[0] toString];
parasDic=[[NSDictionary alloc]init];
JSValue *jsVal=valueArr[1];
NSString *str11=[NSString stringWithFormat:@"%@",jsVal];
parasDic=[self dictionaryWithJsonString:str11];//解析成字典
[self chooseWhichWayToGo];//选择调用点击的哪个方法
NSLog(@"-----");
}];
self.title=[webView stringByEvaluatingJavaScriptFromString:@"document.title"];
}
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
NSString *path=[[request URL] absoluteString];
urlStr=[[request URL] parameterString];
NSLog(@"webview path:%@",path);
[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"test" withExtension:@"js"] encoding:NSUTF8StringEncoding error:nil]];
return YES;
}
3、解析js数据
/*!
* @brief 把格式化的JSON格式的字符串转换成字典
* @param jsonString JSON格式的字符串
* @return 返回字典
*/
- (NSDictionary *)dictionaryWithJsonString:(NSString *)jsonString {
if (jsonString == nil) {
return nil;
}
NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
NSError *err;
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData
options:NSJSONReadingMutableContainers
error:&err];
if(err) {
NSLog(@"json解析失败:%@",err);
return nil;
}
return dic;
}