OC与JS交互

  • 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】

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容