WKWebview不运行javascript(XML HTTP请求)而不添加父视图

时间:2014-10-22 18:03:25

标签: wkwebview

我正在将我的项目从UIWebView更新为WKWebView。在现有的UIWebView方法中,UIWebView在运行javascript之前不会有任何父级,一旦它有内容,它就会在webview中添加父级。内容使用UIWebView呈现正常。我对WKWebView使用相同的方法,但WKWebview坚持加载。有没有办法我们可以在wkwebview上执行javascript而无需在webview中添加父级。另一件有趣的事情是它可以在模拟器上运行而不是在设备上使用localHTTPServer来提供html,css和图像。

解决上述问题的任何建议或提示。

2 个答案:

答案 0 :(得分:14)

我在无头WKWebView中运行socket.io的应用中发现了类似的行为。在我的情况下,Web套接字会一直断开连接而不是重新连接。

似乎由于WKWebView运行javascript off-process,它将暂停任何被认为是空闲的javascript以节省资源(< -IMO)。空闲包括没有父母或app /设备处于非活动状态。所以,是的,看起来你是正确的,因为它在大多数情况下需要父视图。我能够使用以下代码解决这个问题:

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总是运行,无论父级或应用程序状态如何)

希望这有帮助!

答案 1 :(得分:3)

接受的解决方案在某些时候对我有用。我尝试了其他似乎对我有用的东西:

self.keepWebViewActiveTimer = [NSTimer scheduledTimerWithTimeInterval:0.2
                                 target:self 
                                 selector:@selector(_keepWKWebViewActive:)
                                 userInfo:nil
                                 repeats:YES];

_keepWKWebViewActive的位置:

-(void) _keepWKWebViewActive:(NSTimer*) timer{
    if(self.webView) {
        [self.webView evaluateJavaScript:@"1+1" completionHandler:nil];
    }
}