javascript - WKWebView 在后台不运行 JavaScript

标签 javascript ios xcode wkwebview

我注意到有时当 webview 移动到后台时(在顶部有另一个 View Controller ),它会停止 JavaScript 函数的执行,并且只有在返回到前台时才执行它们。
here一个有类似问题的线程,但大多数解决方案都是某种 hack,比如将 webview 添加到关键窗口,或者循环虚拟调用以评估 JavaScript,这样 webview 就不会进入空闲模式并停止 JavaScript。
顺便说一下,这些解决方案很管用,但我一点都不喜欢。
我想知道这个问题是否有更好的解决方案,任何配置 webView 以防止进入空闲模式的方法,或者更优雅的方法来确定 JavaScript 的优先级。
谢谢。

最佳答案

不幸的是,WKWebView 必须在 View 层次结构中才能使用它。您必须将其添加为屏幕 View Controller 的 subview 。

您可以将此添加到屏幕外,使其不可见。隐藏属性也可能起作用。无论哪种方式,您都必须使用它调用 addSubview 才能使其正常工作。

There are some other在这里问答which verify this .

所以,我稍微研究了一下发现了这个

WKWebViewConfiguration* webViewConfig = // set up config

// provide empty frame rect
WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectZero 
configuration:webViewConfig];

// add to keyWindow to ensure it is 'active'
[UIApplication.sharedApplication.keyWindow addSubview:webView];

这种方法至少可以确保 javascript 在应用处于事件状态时运行并且不会影响 UI。如果您需要稍后显示它,您可以在渲染后从 keyWindow 中删除 webView 并重置框架。

希望这对您有所帮助!

编辑

默认禁用 Javascript。为了运行 Javascript,您必须通过 WKPreferences 启用它。 .您需要将首选项对象的 javascriptEnabled 字段设置为 true。

具体来说,您初始化 WKWebView 的代码应该如下所示。

let contentController = WKUserContentController()
contentController.add(self, name: "handler") 

let configuration = WKWebViewConfiguration()
configuration.userContentController = contentController
configuration.preferences = WKPreferences()
configuration.preferences.javaScriptEnabled = true

webview = WKWebView(frame: self.view.frame, configuration: configuration)
webview.uiDelegate = self
webview.navigationDelegate = self
self.view = self.webview

你也可以查看这个 post查看不同的方法。

关于javascript - WKWebView 在后台不运行 JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53482566/

相关文章:

iphone - Objective C NSCFString 与 NSMutableArrays 的泄漏

javascript - 让悬停功能出现在所有 100 个 div 中

ios - 如何获取 UIViewController 中 UIView 的框架坐标?

javascript - 如何将事件处理程序分配给 proto.io 开/关开关?

javascript - 防止垂直触摸移动事件,但通过按钮留下水平触摸和滚动机会

ios - 如何在 Swift 中的 UIActivityViewController 中设置电子邮件收件人。可能吗?

ios - 完全删除 XCode 目标

iphone - 释放 Root View Controller

javascript - 嵌入链接时,NVDA 屏幕阅读器会读取标题两次

javascript - Onclick 无法使用 Bootstrap 工作