内存警告后 WKWebView 变为空白

Posted

技术标签:

【中文标题】内存警告后 WKWebView 变为空白【英文标题】:WKWebView goes blank after memory warning 【发布时间】:2015-02-18 08:17:23 【问题描述】:

我正在开发一个 ios 应用程序,它将在 wkWebView 中显示一些 360 度全景内容。该页面确实加载了,但是当它收到内存警告时,它在 iPad 2 上显示一个空白视图。

相关代码:

NSURLRequest *req = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://360yerevan.com/mobilembed/91001/"] ];


NSString *jScript = @"var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width'); document.getElementsByTagName('head')[0].appendChild(meta);";

WKUserScript *wkUScript = [[WKUserScript alloc] initWithSource:jScript injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
WKUserContentController *wkUController = [[WKUserContentController alloc] init];
[wkUController addUserScript:wkUScript];

WKWebViewConfiguration *wkWebConfig = [[WKWebViewConfiguration alloc] init];
wkWebConfig.userContentController = wkUController;
wkWebConfig.processPool = [[WKProcessPool alloc] init];

WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:wkWebConfig];

[self.view addSubview:webView];
[webView loadRequest:req];

这在 iPhone 5/5S 上运行良好。

有什么想法吗?

【问题讨论】:

我也在调查这个问题。在我们的例子中,沙盒化的 WkWebView.WebContent 进程似乎正在崩溃,并在应用程序中留下空白屏幕。你在哪里看到内存警告,你能分享这些日志吗?我们在这里讨论这个问题:github.com/Telerik-Verified-Plugins/WKWebView/issues/41 也许你可以尝试保持对 webView 的强引用。 感谢@Yinfeng 你的回答很有帮助。 【参考方案1】:

其中一个主要原因是 WebContent 进程崩溃。

在 iOS 9 及更高版本中,您可以使用 WKNavigationDelegate 方法 webViewWebContentProcessDidTerminate 来捕捉这种情况。由您决定如何响应崩溃,但如果重新加载页面就足够了,那么[webView reload] 将执行如下所示的技巧。正如@ray 在 cmets 中提到的那样,您不会从此委托调用中获得有关崩溃的原因的任何有用信息。

- (void)webViewWebContentProcessDidTerminate:(WKWebView *)webView 
    // Reload current page, since we have crashed the WebContent process
    // (most likely due to memory pressure)
    [webView reload];

在iOS8及以下,你可以检查myWKWebViewInstance.title是否为nil。

【讨论】:

每个人都应该知道,此委托方法没有提供有关原因的有用信息,也不一定会触发 OOM 事件。 有时 WKWV 会直接停止渲染内容而不调用此委托。在 iOS 12 中仍然看到这种不良行为。 @ray 是否有任何文章解释了为什么在不调用此委托的情况下仅进行顶部渲染...我还发现当 webViewWebContentProcessDidTerminate 发生时,wkwv 将删除低于 12 的不同 iphone 中的不同视图。 ..有时它显示透明有时只是白屏..

以上是关于内存警告后 WKWebView 变为空白的主要内容,如果未能解决你的问题,请参考以下文章

视图控制器MVC屏幕旋转内存警告

内存警告后释放 UIImage 时崩溃

内存警告后在 iOS 上运行 OpenGL 崩溃

内存警告后的导航控制器堆栈问题

将“复制期间剥离调试符号”设置为 NO 后经常出现内存警告

在 ARC 中收到内存警告