我注意到有时将Webview移到后台(顶部有另一个View Controller)时,它会停止执行JavaScript函数,并仅在返回到前台时才执行它们。
here一个具有类似问题的线程,但是大多数解决方案都是某种黑客行为,例如将Webview添加到键窗口中,或循环对评估JavaScript进行虚拟调用,以使Webview不会进入空闲模式并停止JavaScript 。
这些解决方案虽然可以用,但我一点都不喜欢它们。
我想知道是否有更好的解决方案,可以通过任何方法配置webView来防止进入空闲模式,还是以更优雅的方式对JavaScript进行优先级排序。
谢谢。
答案 0 :(得分:2)
不幸的是,WKWebView必须在视图层次结构中才能使用。您必须已将其添加为屏幕视图控制器的子视图。
您可以添加此屏幕外的内容,使其不可见。隐藏属性可能也起作用。无论哪种方式,都必须调用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,并且不会影响用户界面。如果以后需要显示它,可以在渲染后从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来查看其他方法。