2017-06-20 63 views
3

我有一个WKWebView,使用WKWebViewConfiguration加载本地一组网页,将@"allowFileAccessFromFileURLs"的配置设置为true。WKWebView以某些网页配置挂起本地网页加载。

请求设置了这样的事情:

NSURL *url = [[NSBundle mainBundle] URLForResource:@"testPage" withExtension:@"html" subdirectory:@"html/pages"]; 
NSURLRequest *req = [[NSURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10.0f]; 

然后请求使用以下WKWebview方法发送:

- (nullable WKNavigation *)loadRequest:(NSURLRequest *)request; 

我的问题是在设备有一个当前连接,但没有网络流量。 webview作为屏幕上的一个元素将被添加到屏幕上,并且会提出请求,但webview会在显示本地内容之前显示约50秒的白色屏幕。

无论网络状态如何,webview中的所有内容都会在没有链接调节器设置时在本地加载。

例如,如果设备连接到无线网络,但网络链路调节器设置为100%丢失。 webview被创建并且发送请求来加载触发负载挂起的本地内容。

我有一个想法,它可能是WKWebView试图在需要网络事务的背景做某种验证,但我做了一些网络与仪器分析,还有一些时间轴记录在Safari浏览器中,我无法看到任何会导致它挂起的东西。

我能想到它在50秒左右加载本地内容的唯一原因是它的某种WKWebView超时加载网络连接。

任何帮助将不胜感激,谢谢。

+1

我创建了一个基于您提供的代码的示例项目,将网络链接condi到100%的损失(证实模拟器中的Safari没有互联网连接),并且无法重现此问题。你能否发布能够重现问题的代码(尽可能简单,忽略任何不相关的细节)? – paulvs

+0

嘿谢谢@paulvs的努力!我现在把一个更好的例子放在一起。 –

+1

@paulvs所以我把所有的东西都剥离到了准系统项目中,并且问题不再发生。我现在认为这个问题与实际的网页内容本身有关。如果我研究出了什么问题,我会回到这里。 –

回答

0

好吧,对于那些绊倒我的人,我发现我做错了什么。

这个问题实际上并不是WKWebview或Web内容本身,而是我如何处理Web视图加载的完成。

的方法

- (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation{ 

我是通过评估一些JS像这样监听事件的完成:

-(void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation 
{ 

    [webView evaluateJavaScript:@"document.body.innerHTML" completionHandler:^(id result, NSError *error) 
    { 
     if (result != nil) { 
     [self doCertainNetworkEvent]; //here another method is called with a networking function inside of it. 
    } 
     if(error) 
     { 
      NSLog(@"evaluateJavaScript error : %@", error.localizedDescription); 
     } 
    }]; 

} 

课程结束块不可能完成,直到内的网络功能didFinishNavigation方法调用已完成(这是因为没有流量而无法执行)。