您的位置:首页 > 移动开发 > Objective-C

JS与Objective-C交互(网页与原生交互---使用JavaScriptCore)

2016-09-26 17:46 453 查看
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;
}


获得解析出来的字典后,至此js与oc交互已经基本大功告成,只需根据获得的dict进行相应的跳转等操作。
代码下载地址
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息