WKWebView 中的 Javascript - evaluateJavaScript 与 addUserScript

Posted

技术标签:

【中文标题】WKWebView 中的 Javascript - evaluateJavaScript 与 addUserScript【英文标题】:Javascript in WKWebView - evaluateJavaScript vs addUserScript 【发布时间】:2017-01-05 15:13:47 【问题描述】:

我正在尝试了解使用 WKWebview 执行 javascript 的最佳方式

谁能给我使用 WKWebView 时的用例/最佳实践。

何时使用 addUserScriptWKScriptMessageHandler 以及何时使用 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 是不是可以访问?

WKWebView 不再与 iOS10 中的 Javascript 交互

从 JavaScript 加载 WKWebView 中 iOS tmp/ 文件夹中的图像文件