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执行完毕返回。这就造成了死锁。 官方推荐使用WKWebView
的evaluateJavaScript:completionHandler:
代替这个方法。