15

我正在将我的项目从 UIWebView 更新到 WKWebView。在现有的 UIWebView 方法中,UIWebView 在运行 javascript 之前没有任何父级,一旦有内容,它就会向 webview 添加一个父级。使用 UIWebView 可以很好地呈现内容。我对 WKWebView 使用相同的方法,但是 WKWebview 在加载时卡住了。有什么方法可以在 wkwebview 上执行 javascript 而无需将父级添加到 webview。另一个有趣的事情是它适用于模拟器而不是设备。使用 localHTTPServer 提供 html、css 和图像。

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

4

2 回答 2

16

我在无头 WKWebView 中运行socket.io的应用程序中观察到了类似的行为。在我的情况下,网络套接字会一直断开连接并且不会重新连接。

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

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 总是运行)

希望这可以帮助!

于 2014-10-26T17:33:11.000 回答
7

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

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];
    }
}
于 2016-11-22T10:32:00.540 回答