WKWebView 中的 Javascript - evaluateJavaScript 与 addUserScript
Posted
技术标签:
【中文标题】WKWebView 中的 Javascript - evaluateJavaScript 与 addUserScript【英文标题】:Javascript in WKWebView - evaluateJavaScript vs addUserScript 【发布时间】:2017-01-05 15:13:47 【问题描述】:我正在尝试了解使用 WKWebview 执行 javascript 的最佳方式
谁能给我使用 WKWebView 时的用例/最佳实践。
何时使用 addUserScript 和 WKScriptMessageHandler 以及何时使用 evaluateJavaScript
let jscript = "my script"
let userScript = WKUserScript(source: jscript, injectionTime: .atDocumentEnd, forMainFrameOnly: true)
let userContentController = WKUserContentController()
userContentController.addUserScript(userScript)
let webViewConfiguration = WKWebViewConfiguration()
webViewConfiguration.userContentController = userContentController
webView = WKWebView(frame: self.view.bounds, configuration: webViewConfiguration)
对
let myScript
self.wkWebView.evaluateJavaScript(script) (result, error) in
if error != nil
print("\(error)")
【问题讨论】:
【参考方案1】:找到一个很好的解释
http://jonathanblog2000.blogspot.co.il/2016/11/understanding-ios-wkwebview.html
2.3.2 将原生代码中的javascript注入到js DOM中 强调文字 WKUserContentController 允许在 DOM 树开始加载或完成加载时添加(和删除)WKUserScript。相反,evaluateJavaScript 允许应用程序在任何时间按需执行 javascript sn-p。
【讨论】:
【参考方案2】:根据我的经验,WKUserScript 似乎拥有更多权限,例如: document.cookie="test=test" 适用于 WKUserScript 但不适用于 evaluateJavaScript。
但是,WKUserScript 需要额外的 reload() 才能让您注入的 javascript 运行。这可能是一个错误。有时它会使代码复杂化。
WKScriptMessageHandler 是一个单独的东西。它允许您的本机应用程序接收来自 javascript 的消息。例如,您可以添加一个处理程序并接收从 javascript 发布的消息,例如:“window.webkit.messageHandlers.notification.postMessage(body: "...");” 参考:http://nshipster.com/wkwebkit/
UIWebView 中不存在的很酷的东西
【讨论】:
您可以使用 evaluateJavaScript:completionHandler: 方法来注入 cookie。但是,您应该小心,因为它仅在 webview:didFinishNavigation: 被调用后才起作用。如果在 webView 加载请求之前将 WKUserScript 添加到 contentController 中,则不需要额外的 reload() 操作。以上是关于WKWebView 中的 Javascript - evaluateJavaScript 与 addUserScript的主要内容,如果未能解决你的问题,请参考以下文章
嵌入在 html 中的 javascript 未在 wkwebview 中运行
使用 JavaScript 访问 WKWebView 中的本地文件
在 WKWebView 中的本地网站上调用 javascript Actions
嵌入在 WKWebView 加载的 HTML 文件中的 JavaScript 是不是可以访问?