JS与OC相互调用、传值

本文是在此文章的基础上加入了一点自己的理解,方便在以后工作中需要用到时快速学习。

步骤:

  • 先将html文件加入webView中;
  • 在webView加载完成的回调函数中获取JSContext对象,使用_jsContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];获取JSContext对象,并将self赋值给JSContext中的某属性,代码中使用的是tw,这样做是为了让js能调用到self中的方法。
  • js能代用到oc方法必须是在协议中声明的方法。

js调用oc
完成上述准备步骤后,在js中可直接通过tw.function()调用协议中声明的方法。
oc调用js

    //作用类似获取某个函数
    JSValue *Callback = _jsContext[@"Callback"];
    //调用获取到的函数 并传入参数
    [Callback callWithArguments:@[@"唤起本地OC回调完成"]];
    // 直接调用js中的方法
    NSString *str = @"Callback('OC添加JS提示成功')";
    [_jsContext evaluateScript:str];

html文件代码










JS与OC交换

.h文件代码

#import 
#import 

// JS 调用的OC方法 需要在协议中声明
@protocol JSObjectDelegate 

- (void)call;
- (void)getCall:(NSString*)callString;

@end

@interface JSViewController : UIViewController

@end

.m文件代码

#import "JSViewController.h"
#import "UIViewController+push.h"
#import "constant.h"

@interface JSViewController () 
{
    JSContext *_jsContext;
    UIWebView *_webView;
}
@end

@implementation JSViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.title = @"JS与OC交换";
    self.view.backgroundColor = [UIColor whiteColor];
    [self addMoTaiBack];
    
    _webView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height-0)];
    _webView.delegate = self;
    //从本地加载html文件
    NSString* path = [[NSBundle mainBundle] pathForResource:@"js" ofType:@"html"];
    NSURL* url = [NSURL fileURLWithPath:path];
    NSURLRequest* request = [NSURLRequest requestWithURL:url] ;
    [_webView loadRequest:request];
    
    [self.view addSubview:_webView];
}

// 加载完成
- (void)webViewDidFinishLoad:(UIWebView *)webView {
    // 设置javaScriptContext上下文
    _jsContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    _jsContext[@"tw"] = self;
    _jsContext.exceptionHandler = ^(JSContext *context, JSValue *exceptionValue) {
        context.exception = exceptionValue;
        NSLog(@"异常信息:%@", exceptionValue);
    };
}

- (void)call {
    NSLog(@"call");
    //作用类似获取某个函数
    JSValue *Callback = _jsContext[@"Callback"];
    //调用获取到的函数
    [Callback callWithArguments:@[@"唤起本地OC回调完成"]];
    
//    [self alert];
}

- (void)getCall:(NSString *)callString{
    NSLog(@"Get:%@", callString);
    // 成功回调JavaScript的方法Callback
    JSValue *Callback = _jsContext[@"alerCallback"];
    [Callback callWithArguments:nil];
}

- (void)alert{
    // 直接添加提示框
    NSString *str = @"Callback('OC添加JS提示成功')";
    [_jsContext evaluateScript:str];
    
}
@end

你可能感兴趣的:(JS与OC相互调用、传值)