用于 JavaScript 的 UIWebView 或 WKWebkit?

Posted

技术标签:

【中文标题】用于 JavaScript 的 UIWebView 或 WKWebkit?【英文标题】:UIWebView or WKWebkit for JavaScript? 【发布时间】:2015-07-25 10:31:49 【问题描述】:

我想加载一个请求的网页并访问 DOM 的元素以从其中一个节点返回一个值。我有一些 javascript 可以做到这一点。问题是将值返回到我的应用程序的最佳方法。 我看到 UIWebView 有一个功能

stringByEvaluatingJavaScriptFromString

WKWebKit 有功能

func evaluateJavaScript(javaScriptString: String!, completionHandler: ((AnyObject!, NSError!) -> Void)!)

那么它们之间的主要区别是什么,哪个更好,为什么对于我的用例?

【问题讨论】:

【参考方案1】:

总的来说,WKWebView 与 UIWebView 在一些方面有所不同

它使用与 Safari 相同的 Javascript 引擎,因此它在 Javascript 评估时要快得多(它使用即时编译将您的脚本编译为机器代码,然后再运行它) 仅支持 ios8 及以上版本,因此不适用于旧平台 它在单独的进程中运行,因此 WKWebView 代码中的崩溃不会导致您的整个应用崩溃。

为了回答您的具体问题,UIWebView stringByEvaluatingJavaScriptFromString 在等待您的代码运行时会阻止您的应用,因此是同步的。相比之下,因为 WKWebView 代码是在另一个进程中运行的,所以你必须与它异步交互;您将运行 Javascript 的请求提交给 WebKit 进程,当 JavaScript 评估完成并准备好结果时,您的完成处理程序就会运行。同时,调用evaluateJavaScript的线程会继续执行其他代码。

【讨论】:

精湛的解释。这是在苹果文档中还是您自己的个人知识中? 文档显然注意到 [WKWebView evaluateJavaScript] 是异步的,但我现在找不到任何关于我上面提出的三点的权威提及。他们绝对是真的。您实际上可以在仪器中看到 WebKit 进程本身,例如 我什至找不到它说异步的地方。我想这就是我们来到 SO 的原因 :)

以上是关于用于 JavaScript 的 UIWebView 或 WKWebkit?的主要内容,如果未能解决你的问题,请参考以下文章

UIPageViewControlerDataSource 和 UiWebView 用于在页面上显示

UIWebView 能否用于在 iOS 应用中查看和编辑 XML 文档

UIWebView 保存用户名和密码

iOS 的 UIWebView 使用的 JavaScript 引擎叫啥名字?

在 UIWebView 上加载 javascript

使用 JavaScript 的 UIWebView CSS 注入