OC与JS交互

  • OC调用JS
方法一(常用)

利用WebView的stringByEvaluatingJavaScriptFromString方法调用JS代码

//调用JS的callJS方法,并且传入param参数,这里要注意参数使用的是单引号‘’
NSString *js = [NSString stringWithFormat:@"callJS('%@')",param];
//把JS传入WebView的运行环境中
NSString *string = [self.webView stringByEvaluatingJavaScriptFromString:js];
方法二

利用系统框架的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;

    // 最后通过判断来做一些处理
}
方法二

应用系统框架

此方法的重点是取到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协议方式

  • 首先:自定义协议,并且协议遵守协议
    并且定义协议方法(就是JS调用的OC方法)
@protocol QSJSExport 
 - (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】

你可能感兴趣的:(OC与JS交互)