原创文章,转载请指明原文链接,谢谢。
JS和OC本地的数据传递有几种方式,我说其中的一种原理:
通过在JS中自定义 协议+数据,然后重定向,在oc的webView的代理中获取重定向的
这是一种比较简单的方法。
OC中,iOS 8.0 以上,使用WKWebView,在代理方法
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction
decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
中进行拦截。
// 在发送请求之前,决定是否跳转
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
NSString *requestStr = [[navigationAction.request.URL absoluteString] stringByRemovingPercentEncoding];
NSLog(@"Load URL : %@ ", navigationAction.request.URL);
NSLog(@"requestStr : %@ ", requestStr);
//判断是否是双方协定的协议
if ([requestStr hasPrefix:@"CNT://"]) {
//使用了JSONKit 将{"result":1}转换成了Dictionary
NSDictionary *paramStr = [[requestStr substringFromIndex:6] objectFromJSONString];
NSLog(@"paramStr: %@",paramStr);
decisionHandler(WKNavigationActionPolicyCancel);
return;
}
decisionHandler(WKNavigationActionPolicyAllow);
}
hmtl的代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Test JS to OC</title>
</head>
<body>
<button align onclick='testClick()'>提交</button>
<script>
function testClick(){
//(协议CNT:// + 数据)
var data ={
result:1
}
//重定向
window.location.href = "CNT://" + JSON.stringify(data);
}
</script>
</body>
</html>
testClick()中的CNT://为js和OC之间协定的自定义协议,可以根据个人需要任意取值,但双方要统一。
如果想要处理更多的场景,可以对传递的json数据协定具体的key,根据不同的key指定OC的类、调用方法、参数和值等。
iOS8以下的如果使用UIWebView,道理是一样的,只是webView的delegate处理方法换成
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request
navigationType:(UIWebViewNavigationType)navigationType