我正在将我的项目从UIWebView更新为WKWebView。在现有的UIWebView方法中,UIWebView在运行javascript之前不会有任何父级,一旦它有内容,它就会在webview中添加父级。内容使用UIWebView呈现正常。我对WKWebView使用相同的方法,但WKWebview坚持加载。有没有办法我们可以在wkwebview上执行javascript而无需在webview中添加父级。另一件有趣的事情是它可以在模拟器上运行而不是在设备上使用localHTTPServer来提供html,css和图像。
解决上述问题的任何建议或提示。
答案 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];
}
}