iOS UIWebView loadRequest 耗时太长

标签 ios objective-c uiwebview wkwebview request-timed-out

我的应用程序中有一个 UIWebView

-(void)viewDidLaod{
    NSURL *url = [NSURL URLWithString:@"some url string"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadRevalidatingCacheData timeoutInterval:30.0];        
    myWbView.delegate = self;
        [myWebView loadRequest:request];

        if ([timer isValid]) {
            [timer invalidate];
        }else{
            timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(addSec:) userInfo:nil repeats:YES];
             //counting seconds
}

-(void)webViewDidFinishLoad:(UIWebView *)webView{
    if (webView.isloading){
    NSLog(@"LOADING");//it takes 5-8 seconds in average keep logging this
    }else{
    NSLog(@"FINISH");//since the request started,8-15 seconds later this is logged out
    }
}

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error{
NSLog(@"LOAD FAIL: %@",error);
}

这是webpage 我正在尝试加载, 我将 webview Controller 放在 pageViewController 中,每次滑动到下一页时,都会启动新的加载请求。

(当滑出 View 释放时,我确实会停止任何未完成的加载,因此它不会阻塞网页)

有时我会收到一些错误消息,例如:

error from didFialLoadWithError

作为应用程序开发的新手,我完全不知道我的代码出了什么问题,是某个线程卡住了还是使用 JavaScript/HTML5 的网页影响了速度?

我研究过 Flipboard 应用程序(iOS7 版本),它使用 webview 加载内容页面,它在用户点击其上的任何帖子后立即响应。即使 UIWebView 的加载速度通常很慢,也可以实现更快的性能。

任何我应该知道的建议的指南链接/背景知识将不胜感激。

PS:由于另一个更好的东西WKWebView仅在iOS8及更高版本中支持 (在我的应用中 WKWebView 加载速度与 UIWebView 相同,但得分更高 HTML5 test site ), 我仍然需要 iOS7 的 UIWebView。

最佳答案

嗯,您打印的错误的 NSLocalizedDescription 说明了发生的情况:“HTTP 重定向过多。”

当您尝试访问网页时,服务器不会向您提供您要访问的页面,而是会使用重定向(您应该访问的其他页面的地址)进行回复。例如,访问缩短的链接通常会将您重定向到真实页面;受密码保护的网站可能会将您重定向到登录页面;或者重新设计的网站可能会将旧地址重定向到新位置。

但是,如果不仔细实现,此功能最终可能会通过无限重定向来锁定浏览器:例如,想象一下,如果 www.example.com/a 将您重定向到 www .example.com/bwww.example.com/b 将您重定向回 www.example.com/a。因此,浏览器对它们将遵循的重定向数量施加限制(通常约为十或十五),以避免陷入此类循环。

您收到的错误意味着,由于某种原因,访问该页面导致您的浏览器连续多次重定向,以至于它只是认为一定出了问题并放弃了。

坐在这里,没有您的应用程序副本可供检查,我无法告诉您这些重定向是什么,更不用说为什么发出它们,但您至少可以使用 Safari Web Inspector 回答第一个问题。您可以在 Safari 的“开发”菜单中找到它,该菜单可以在 Safari 偏好设置中启用;该菜单中有一些选项可用于检查 iOS 设备或模拟器中的网页。您可能还需要在设备或模拟器的 Safari 设置中打开 Web Inspector 选项。

Web Inspector 的时间线工具可以告诉您正在发送哪些重定向。一旦您了解了这一点,您就可以弄清楚它为什么要做它正在做的事情,甚至可以调整您的应用程序来解决该问题。 (例如,您的 UIWebView 使用的用户代理字符串可能会混淆所涉及的服务器。不过,这完全是猜测,所以不要假设这就是这里发生的情况。)

关于iOS UIWebView loadRequest 耗时太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29118014/

相关文章:

ios - 我真的需要为每个 UIStoryboard 语言文件添加两次相同的元素吗?

ios - 从它自己的 UView 子类中添加 UIView 作为 SuperView subview

ios - UICollectionView 在 ios 7 中接收到单元格的布局属性

iphone - 在 UIWebView 中加载本地 HTML 文件时遇到问题

ios - 如何在 iOS 上显示电子邮件正文

ios - NSJSON 序列化失败

c# - 如何创建 xamarin 表单按钮左角半径

ios - 如何使用 UiWebView 和 Objective-C 创建持久缓存?

ios - UIImage PNG 不透明度调整

iphone - 如何取消在 UIWebView 中发出的请求?