WebView中OC与JS通信

/ 0评 / 0

OC中与JS之间交互有两种方式,第一种是在webView的代理方法中拦截网页插入JS代码达到效果:

#pragma mark - UIWebViewDelegate
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
    NSURL * url = [request URL];
   if ([[url scheme] isEqualToString:@"test"]) {
        return NO;
    }
    return YES;
}

这是一种老的方式,之前的很多三方库都是这样事项的,像 WebViewJavascriptBridge;

这里着重说一下第二种方式,iOS7之后apple添加了一个新的库JavaScriptCore,用来做JS交互,因此JS与原生OC交互也变得简单了许多。
这是一个简单登录界面




写两个用到的JS方法

function getValue(){
    var phoneNum = document.getElementById('phoneNum').value;
    var passWord = document.getElementById('passWord').value;
    test1(phoneNum,passWord);
}

function setValue(obj){
    document.getElementById('phoneNum').placeholder = obj;
    document.getElementById('passWord').placeholder = obj;
}

获取JS传过来的值

- (void)webViewDidFinishLoad:(UIWebView *)webView{
    self.context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    
    self.context[@"test1"] = ^(){
        NSArray * args = [JSContext currentArguments];//传过来的参数
        NSString * name = args[0];
        NSString * str = args[1];
        NSLog(@"--%@--%@",name,str);
    };
}

OC给JS发送消息

- (void)viewDidLoad {
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"调用" style:UIBarButtonItemStyleDone target:self action:@selector(setValueToJS)];
}

- (void)webViewDidFinishLoad:(UIWebView *)webView{
    self.context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
}

- (void)setValueToJS{
    NSString *setValueJS = @"setValue('123')";
    [self.context evaluateScript:setValueJS];
}

评论已关闭。