WKWebView在后台运行时不运行JavaScript

时间:2018-11-26 13:50:50

标签: javascript ios xcode wkwebview

我注意到有时将Webview移到后台(顶部有另一个View Controller)时,它会停止执行JavaScript函数,并仅在返回到前台时才执行它们。
here一个具有类似问题的线程,但是大多数解决方案都是某种黑客行为,例如将Webview添加到键窗口中,或循环对评估JavaScript进行虚拟调用,以使Webview不会进入空闲模式并停止JavaScript 。
这些解决方案虽然可以用,但我一点都不喜欢它们。
我想知道是否有更好的解决方案,可以通过任何方法配置webView来防止进入空闲模式,还是以更优雅的方式对JavaScript进行优先级排序。
谢谢。

1 个答案:

答案 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来查看其他方法。