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