WKWebView 在本地网页加载时挂起,具有特定的 Web 配置。

WKWebView Hangs on local webpage load with certain web configuration.

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

请求是这样设置的:

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秒的白屏。

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

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

我想可能是 WKWebView 试图在后台进行某种验证,需要网络事务,但我用仪器做了一些网络分析,还在 safari webview 中做了一些时间线记录,但我做不到看到任何会导致它挂起的东西。

我认为它会在 50 秒左右后加载本地内容的唯一原因是它遇到了某种 WKWebView 超时以加载网络连接。

非常感谢任何帮助,谢谢。

好吧,对于任何偶然发现这个问题的人,我发现我做错了什么。

问题实际上不是 WKWebview 或 web 内容本身,而是我处理 webview 加载完成的方式。

在方法中:

- (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 方法调用中的网络功能完成之前,完成块当然无法完成(因为没有流量而无法完成。)