UIWebView js OC简单交互

1.js调用oc 里边的方法

使用时候需要在html 页面的事件里边调用back 方法既可以执行oc 的goback 方法;

-(void)webViewDidFinishLoad:(UIWebView *)webView
{
    //iOS调用js
    //首先创建JSContext 对象(此处通过当前webView的键获取到jscontext)
    JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    
    //js调用iOS
    //第一种情况
    //其中test1就是js的方法名称,赋给是一个block 里面是iOS代码
    //此方法最终将打印出所有接收到的参数,js参数是不固定的 我们测试一下就知道
    context[@"back"] = ^() {
        //获取到back里携带 的参数
//        NSArray *args = [JSContext currentArguments];
//        for (id obj in args) {
//            NSLog(@"%@",obj);
//        }
        [self goBack];
    };
}
- (void)goBack{
    /*
     最新版本的iOS系统做了改动,现在(iOS9,Xcode 7.3,去年使用Xcode 6 和iOS 8没有线程问题)中测试,block中是在子线程,因此执行UI操作,控制台有警告,需要回到主线程再操作UI。
     */
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"aaaaaa");
        [self.navigationController popViewControllerAnimated:YES];
    });
  
}

2.oc 调用js 方法

方式一

NSString *jsStr = [NSString stringWithFormat:@"showAlert('%@')",@"这里是JS中alert弹出的message"];
[_webView stringByEvaluatingJavaScriptFromString:jsStr];

注意:该方法会同步返回一个字符串,因此是一个同步方法,可能会阻塞UI。

方式二

继续使用JavaScriptCore库来做JS交互。

JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
NSString *textJS = @"showAlert('这里是JS中alert弹出的message')";
[context evaluateScript:textJS];

重点:
stringByEvaluatingJavaScriptFromString是一个同步的方法,使用它执行JS方法时,如果JS 方法比较耗的时候,会造成界面卡顿。尤其是js 弹出alert 的时候。
alert 也会阻塞界面,等待用户响应,而stringByEvaluatingJavaScriptFromString又会等待js执行完毕返回。这就造成了死锁。
官方推荐使用WKWebViewevaluateJavaScript:completionHandler:代替这个方法。

转载于:https://my.oschina.net/iceTear/blog/748537

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值