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

2017-08-17  本文已影响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!记下来,以后需要的时候 就不用走弯路了。


上一篇下一篇

猜你喜欢

热点阅读