美文网首页
关于JS 调用 OC 并且 拿到 返回值的 一些坑

关于JS 调用 OC 并且 拿到 返回值的 一些坑

作者: 不言不爱 | 来源:发表于2017-08-17 16:09 被阅读0次

    概括:1.使用UIWebview 2 .使用 JavaScriptCore 3. 使用UIWebView+TS_JavaScriptContext(gitHub上直接搜索下载引到工程里)


    首先 UIwebview 的代理方法 和使用 这里就不说了,网上一搜一大堆。直接进入主题

    可能有人在做JS 与 OC 的交互的时候 遇到一种情况 就是JS 调用OC 的方法 然后拿到返回值 给JS。  客户端怎么做才能 满足  JS 只需要按照自己的调用形式去调用就能拿到返回值呢。首先我们要基于 JavaScriptCore 框架 中的jscontext 。 当我们拿到jscontext 就相当于拿到了JS 的运行环境,然后向里面注册一些JS 脚本。加入 OC 与 js  约定好的方法是 一个要求返回 用户信息的方法(这里我们起名字叫 getUserName)。接下来步骤:

    1.OC 中 我们需要在页面加载完成 通过 self.jsContext = (JSContext *)[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];获取上下文  

    然后通过jscontext 注入方法 约定好的方法 self.jsContext[@"getUserName"]=^{

    ///这里处理逻辑。加入要返回一个值 那么

    JSValue*result = [JSValue valueWithObject:[NSStringstringWithFormat:@"%f",这里是处理逻辑计算出来的结果值] inContext:self.jscontext];

    return result;

    }这样 JS  var result = window.getUserName()   result 可以拿到OC 返回来的值。


    重点来了  ,对于重定向 或者刷新的页面  oc注册的那个代码块 不执行 。那么就用到概括里的第三条 从github下载下来 有演示 。 我直接用到 其中重要的俩个文件 。用这个方法 - (void)webView:(UIWebView *)webView didCreateJavaScriptContext:(JSContext*) ctx{

    ctx[@"getUserName"] = ^{

    处理逻辑 

    JSValue*result = [JSValue valueWithObject:[NSStringstringWithFormat:@"%f",这里是处理逻辑计算出来的结果值] inContext:self.jscontext];

    reture result;

    }

    }

    这样 就可以了  记得 实现引用文件中的协议哦。

    UIWebView+TS_JavaScriptContext,这是基于运行时,给webView增加的protocol,在JavaScriptCore创建好上下文时,就进行桥接传递值了。 OK!记下来,以后需要的时候 就不用走弯路了。


    相关文章

      网友评论

          本文标题:关于JS 调用 OC 并且 拿到 返回值的 一些坑

          本文链接:https://www.haomeiwen.com/subject/ottnrxtx.html