概括: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!记下来,以后需要的时候 就不用走弯路了。
网友评论