我注意到有时当 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/