UIWebView中OC与JS的传统交互方式特别简单
1. 这里准备了一个本地的index.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>OC与JS交互</title>
<script>
function showAlert(name){
alert(name);
return function handle(str){
alert('我是一个弹窗'+name+str);
return name + '返回给OC';
}
}
</script>
</head>
<body>
<a href="lgedu:///getSum/helloword/js">点击跳转响应OC方法</a>
<a href="lgedu://getPlus/helloword/js">点击跳转效应</a>
<form id="myform" action="lgedu://www.baidu.com/hello/j/Users/spirej/Desktop/OCJS/index.htmls" method="get">
<input id="submit" type="submit" value="我是提交">
</form>
<input type="button" value="弹框" onclick="showAlert('hello JS')"><br/>
</body>
</html>
2. JS调用OC
// 加载所有请求数据,以及控制是否加载
// JS 调用 OC --> shouldStartLoadWithRequest
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSLog(@"scheme = %@", request.URL.scheme); // 标示 我们自己的协议
NSLog(@"host = %@", request.URL.host); // 方法名
NSLog(@"pathComponents = %@", request.URL.pathComponents); // 参数
// JS 调用OC 的原理就是 拦截URL
NSString *scheme = request.URL.scheme;
if ([scheme isEqualToString:@"lgedu"]) {
NSArray *array = request.URL.pathComponents;
if (array.count > 1) {
NSString *methodName = array[1];
if ([methodName isEqualToString:@"getSum"]) {
[self performSelector:NSSelectorFromString(methodName) withObject:array afterDelay:0];
//...
}
}
}
return YES;
}
JS调用OC就是UIWebViewDelegate的这个代理方法shouldStartLoadWithRequest
,其实质就是 拦截URL,解析URL并找到事先约定好的标识,时候判断实现相应的业务逻辑处理。
下面这些都是JS响应的样式,都会回到UIWebViewDelegate的这个方法来
UIWebViewNavigationTypeLinkClicked, 点击
UIWebViewNavigationTypeFormSubmitted, 提交
UIWebViewNavigationTypeBackForward, 返回
UIWebViewNavigationTypeReload, 刷新
UIWebViewNavigationTypeFormResubmitted, 重复提交
UIWebViewNavigationTypeOther 其他
3. OC调用JS
- (nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;
OC调用JS就是实现UIWebView的这个方法stringByEvaluatingJavaScriptFromString
,传一个字符串可以是JS里面写的方法名。
文中所有示例demo可以在这里下载
https://github.com/SPIREJ/OCJS