iOS UIWebView loadRequest занимает слишком много времени
У меня есть такой 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);
}
вот веб-страницу, которую я пытаюсь загрузить, я поместил контроллер веб-просмотра в pageViewController
что каждый раз, когда я пролистываю на следующую страницу, запускается новый запрос на загрузку.
(Я прекращаю любую незавершенную загрузку, когда вычеркнуты просмотры, поэтому он не будет блокировать веб-шаг)
иногда я получаю некоторые сообщения об ошибках, такие как:
Будучи новичком в разработке приложений, я совершенно не представляю, что не так с моим кодом, какая-то нить застряла или веб-страница, использующая JavaScript/HTML5, имеет значение для скорости?
Я посмотрел на приложение Flipboard (версия iOS7), которое использует веб-просмотр для загрузки страницы содержимого, оно отвечает сразу после того, как пользователь нажмет на него любое сообщение. Даже если скорость загрузки UIWebView
обычно медленный, возможно более быстрое выполнение.
Будем благодарны за любые предлагаемые ссылки / справочные знания, которые я должен был знать.
PS: с еще одним лучшим материалом WKWebView
поддерживается только в iOS8 и более поздних версиях (в моем приложении WKWebView
загружается с той же скоростью, что и UIWebView
, но баллы выше на тестовом сайте HTML5), мне все еще нужен UIWebView для iOS7.
2 ответа
Ну, то NSLocalizedDescription
напечатанная ошибка говорит о том, что происходит: "Слишком много перенаправлений HTTP".
Когда вы пытаетесь получить доступ к веб-странице, вместо того, чтобы предоставить вам страницу, которую вы пытаетесь открыть, сервер может ответить перенаправлением - адресом для другой страницы, на которую вам следует перейти. Например, доступ к сокращенной ссылке обычно перенаправляет вас на реальную страницу; защищенный паролем веб-сайт может перенаправить вас на страницу входа; или сайт, который был переработан, может перенаправить старые адреса в их новые местоположения.
Однако, если эта функция не реализована тщательно, она может заблокировать браузер, перенаправив его бесконечно: например, представьте, что www.example.com/a
перенаправил вас на www.example.com/b
, а также www.example.com/b
перенаправил вас обратно www.example.com/a
, Таким образом, браузеры налагают ограничение на количество перенаправлений, которые они будут выполнять, обычно около десяти или пятнадцати, чтобы избежать зацикливания в таких циклах.
Ошибка, которую вы получаете, означает, что по какой-то причине доступ к этой странице приводит к тому, что ваш браузер перенаправляется много раз подряд - так много, что он просто предполагает, что что-то не так, и отказывается.
Сидя здесь без копии вашего приложения для изучения, я не могу сказать вам, что это за перенаправления, не говоря уже о том, почему они выпускаются, но вы можете, по крайней мере, ответить на первый вопрос с помощью Safari Web Inspector. Вы найдете его в меню "Разработка" Safari, которое можно включить в настройках Safari; в этом меню есть опции для просмотра веб-страниц на устройствах iOS или в симуляторах. Возможно, вам придется включить опцию Web Inspector в настройках Safari устройства или симулятора.
Инструмент временной шкалы веб-инспектора может сказать, через какие перенаправления вы получаете отправку. Зная это, вы сможете понять, почему он делает то, что он делает, и, возможно, даже настроить свое приложение, чтобы обойти эту проблему. (Например, строка пользовательского агента, используемая вашим UIWebView, может сбить с толку задействованные серверы. Однако это полное предположение, поэтому не думайте, что это происходит здесь.)
Переместите запрос с помощью executeselector inbackground, иначе он блокирует ваш поток пользовательского интерфейса. Еще один момент, объект UIWebView является тяжелым,