JS 和OC的数据传递

来源:互联网 发布:时标网络图 软件 编辑:程序博客网 时间:2024/06/18 01:28

原创文章,转载请指明原文链接,谢谢。

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