WKWebView 在后台时不运行 JavaScript

Posted

技术标签:

【中文标题】WKWebView 在后台时不运行 JavaScript【英文标题】:WKWebView doesn't run JavaScript when on background 【发布时间】:2018-11-26 13:50:49 【问题描述】:

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

【问题讨论】:

【参考方案1】:

不幸的是,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 在应用程序处于活动状态时运行并且不会影响 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 以了解不同的方法。

【讨论】:

感谢您的链接!您能否用代码扩展此答案,以便我可以提供一个如何解决此问题的确切示例? ***.com/a/49350647/627473 @ChrisMuench 你能解释一下你到底需要实现什么吗?一些最小的代码也将受到欢迎。 (以及对该问题的评论,以便我们在那里提及您) 我正在寻找允许 WKWebView 在被另一个视图覆盖时运行 JavaScript 的代码 我试过了,但我不知道把这段代码放在哪里。这也是一个新的空 wkwebview 还是应该添加到我在 Ui builder 中创建的现有视图中 您可以将该方法添加到您的代码中。但是如果没有看到任何代码,我无法为您提供更多帮助。但是您可以检查此链接,也许它会对您有所帮助。 ***.com/questions/32582198/…

以上是关于WKWebView 在后台时不运行 JavaScript的主要内容,如果未能解决你的问题,请参考以下文章

WKWebView 正在尝试在后台运行,尽管它已关闭并且应该被处置

WkWebview contentOffset 在设置动画 false 时不起作用

当android应用程序后台运行时如何在android中隐藏视图(在后台运行时不停止android拍摄快照)[重复]

苹果手机怎么设置后台运行时不自动关闭?

WKWebView 在后台应用程序时停止音频

iOS:在 WKWebView 中嵌入视频在后台停止音乐