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

Sub*_*bba 10 wkwebview

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

任何建议或提示,以解决上述问题.

mat*_*ttr 14

我在无头WKWebView中运行socket.io的 app中观察到了类似的行为.在我的情况下,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];
Run Code Online (Sandbox Code Playgroud)

这种方法至少可以确保在应用程序处于活动状态时运行javascript并且不会影响UI.如果以后需要显示它,可以在渲染后从keyWindow中删除webView并重置帧.而且,是的,我还观察到在模拟器中这不是问题(javascript总是运行,无论父级还是应用程序状态)

希望这可以帮助!

  • 哇.太棒了,你得到解决方法的方式.有用.但是在某些时候我们应该从keywindow中删除webview吧?否则可能会出现性能或内存限制. (2认同)

小智 6

接受的解决方案有时对我有用。我尝试了其他似乎对我始终有效的方法:

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

在哪里_keepWKWebViewActive

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