iOS UIWebView loadRequest 耗时太长
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);
}
这是我正在尝试加载的 webpage,
我将 webview 控制器放在 pageViewController
中,每次我滑动到下一页时,都会启动一个新的加载请求。
(当刷出视图 dealloc 时,我会停止所有未完成的加载,因此它不会阻塞网络)
有时我会收到一些错误消息,例如:
作为应用程序开发的新手,我完全不知道我的代码有什么问题,是某个线程卡住了还是使用 JavaScript/HTML5 的网页影响了速度?
我研究过 Flipboard 应用程序(iOS7 版本),它使用 webview 加载内容页面,它会在用户点击任何 post 后立即响应。即使 UIWebView
的加载速度通常很慢,也可以实现更快的性能。
任何建议的指南link/我应该知道的背景知识将不胜感激。
PS:由于另一个更好的东西 WKWebView
仅在 iOS8 及更高版本中受支持
(在我的应用中 WKWebView
加载速度与 UIWebView
相同,但在 HTML5 test site 时得分更高),
iOS7.
我仍然需要 UIWebView
在后台使用 performselector 移动请求,否则它会阻塞您的 UI 线程。还有一点,UIWebView对象比较重,
好吧,您打印的错误 NSLocalizedDescription
说明了发生了什么:"Too many HTTP redirects."
当您尝试访问网页时,服务器不会为您提供您尝试访问的页面,而是会回复一个重定向——您应该访问的其他页面的地址。例如,访问缩短的 link 通常会将您重定向到真实页面;受密码保护的网站可能会将您重定向到登录页面;或者经过重新设计的网站可能会将旧地址重定向到新位置。
但是,如果不小心实施,此功能可能会通过无限重定向而最终锁定浏览器:例如,想象一下如果 www.example.com/a
将您重定向到 www.example.com/b
,并且 www.example.com/b
将您重定向回 www.example.com/a
。因此,浏览器对它们将遵循的重定向数量施加了限制——通常大约为 10 或 15 个——以避免陷入此类循环。
您收到的错误意味着,出于某种原因,访问该页面会导致您的浏览器连续多次重定向——次数太多以至于它只是假设一定有问题并放弃了。
坐在这里,没有要检查的应用程序副本,我不能告诉你这些重定向是什么,更不用说为什么要发布它们了,但你至少可以使用 Safari Web Inspector 回答第一个问题.您可以在 Safari 的 "Develop" 菜单中找到它,该菜单可以在 Safari 偏好设置中启用;该菜单中有选项可以检查 iOS 设备或模拟器中的网页。您可能还必须在设备或模拟器的 Safari 设置中打开 Web Inspector 选项。
Web Inspector 的时间轴工具可以告诉您发送了哪些重定向。一旦您了解了这一点,您就可以弄清楚为什么它正在做它正在做的事情,甚至可以调整您的应用程序来解决这个问题。 (例如,您的 UIWebView 使用的用户代理字符串可能会混淆所涉及的服务器。不过,这完全是猜测,所以不要假设这就是这里发生的事情。)
我的应用程序中有一个 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 控制器放在 pageViewController
中,每次我滑动到下一页时,都会启动一个新的加载请求。
(当刷出视图 dealloc 时,我会停止所有未完成的加载,因此它不会阻塞网络)
有时我会收到一些错误消息,例如:
作为应用程序开发的新手,我完全不知道我的代码有什么问题,是某个线程卡住了还是使用 JavaScript/HTML5 的网页影响了速度?
我研究过 Flipboard 应用程序(iOS7 版本),它使用 webview 加载内容页面,它会在用户点击任何 post 后立即响应。即使 UIWebView
的加载速度通常很慢,也可以实现更快的性能。
任何建议的指南link/我应该知道的背景知识将不胜感激。
PS:由于另一个更好的东西 WKWebView
仅在 iOS8 及更高版本中受支持
(在我的应用中 WKWebView
加载速度与 UIWebView
相同,但在 HTML5 test site 时得分更高),
iOS7.
在后台使用 performselector 移动请求,否则它会阻塞您的 UI 线程。还有一点,UIWebView对象比较重,
好吧,您打印的错误 NSLocalizedDescription
说明了发生了什么:"Too many HTTP redirects."
当您尝试访问网页时,服务器不会为您提供您尝试访问的页面,而是会回复一个重定向——您应该访问的其他页面的地址。例如,访问缩短的 link 通常会将您重定向到真实页面;受密码保护的网站可能会将您重定向到登录页面;或者经过重新设计的网站可能会将旧地址重定向到新位置。
但是,如果不小心实施,此功能可能会通过无限重定向而最终锁定浏览器:例如,想象一下如果 www.example.com/a
将您重定向到 www.example.com/b
,并且 www.example.com/b
将您重定向回 www.example.com/a
。因此,浏览器对它们将遵循的重定向数量施加了限制——通常大约为 10 或 15 个——以避免陷入此类循环。
您收到的错误意味着,出于某种原因,访问该页面会导致您的浏览器连续多次重定向——次数太多以至于它只是假设一定有问题并放弃了。
坐在这里,没有要检查的应用程序副本,我不能告诉你这些重定向是什么,更不用说为什么要发布它们了,但你至少可以使用 Safari Web Inspector 回答第一个问题.您可以在 Safari 的 "Develop" 菜单中找到它,该菜单可以在 Safari 偏好设置中启用;该菜单中有选项可以检查 iOS 设备或模拟器中的网页。您可能还必须在设备或模拟器的 Safari 设置中打开 Web Inspector 选项。
Web Inspector 的时间轴工具可以告诉您发送了哪些重定向。一旦您了解了这一点,您就可以弄清楚为什么它正在做它正在做的事情,甚至可以调整您的应用程序来解决这个问题。 (例如,您的 UIWebView 使用的用户代理字符串可能会混淆所涉及的服务器。不过,这完全是猜测,所以不要假设这就是这里发生的事情。)