[英]iOS UIWebView loadRequest takes too long
我的应用程序中有一个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);
}
这是我要加载的网页 ,我将webview控制器放在pageViewController
,每次我滑动到下一页时,都会启动新的加载请求。
(当滑出的视图取消分配时,我会停止所有未完成的加载,因此不会阻塞Web界面)
有时我会收到一些错误消息,例如:
作为应用程序开发的新手,我完全不知道我的代码有什么问题,是某个线程卡住了还是使用JavaScript / HTML5的网页对速度至关重要?
我调查了Flipboard应用程序(iOS7版本),该应用程序使用webview加载内容页面,在用户点击任何内容后立即响应。 即使UIWebView
的加载速度通常很慢,也可以实现更快的性能。
我应该知道的任何建议的指南链接/背景知识将不胜感激。
PS:由于只有在iOS8及更高版本中才支持WKWebView, WKWebView
是另一个更好的东西(在我的应用中, WKWebView
加载速度与UIWebView
相同,但在HTML5测试站点上得分更高),因此我仍然需要iOS7的UIWebView。
好吧,您打印的错误的NSLocalizedDescription
指出了正在发生的事情:“ HTTP重定向太多。”
当您尝试访问网页时,服务器可以给您重定向,而不是为您提供要访问的页面,而是重定向到另一个页面,而您应该转到该地址。 例如,访问缩短的链接通常会将您重定向到真实页面; 受密码保护的网站可能会将您重定向到登录页面; 否则经过重新设计的网站可能会将旧地址重定向到其新位置。
但是,如果不仔细实施,此功能最终可能会通过无限重定向来锁定浏览器:例如,假设www.example.com/a
将您重定向到www.example.com/b
和www.example.com/b
将您重定向回www.example.com/a
。 因此,浏览器对其遵循的重定向数量施加了限制(通常为10或15个),以避免陷入此类循环。
您收到的错误表示,由于某种原因,访问该页面导致浏览器连续多次重定向-如此之多,以至于它只是假定一定有问题并放弃了。
坐在这里,没有您的应用程序副本可供检查,我无法告诉您这些重定向是什么,更不用说为什么要发布这些重定向了,但是您至少可以使用Safari Web Inspector回答第一个问题。 您可以在Safari的“开发”菜单中找到它,可以在Safari偏好设置中启用该菜单; 该菜单中有一些选项可以检查iOS设备或模拟器中的网页。 您可能还必须在设备或模拟器的Safari设置中打开“ Web检查器”选项。
Web检查器的时间轴工具可以告诉您通过什么重定向发送。 一旦知道了这一点,您就可以弄清它为什么这样做了,甚至可以调整您的应用程序来解决该问题。 (例如,您的UIWebView使用的用户代理字符串可能会使所涉及的服务器感到困惑。不过,这是一个完整的猜测,因此,请不要以为这就是问题所在。)
使用performselector在后台移动请求,否则它会阻塞您的UI线程。 还有一点,UIWebView对象很重,
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.