iOS 6 UIWebView loadHTMLString с базовым URL

У меня огромная проблема на iOS 6.

Мне нужно отображать веб-страницу при запуске приложения. Я использую для этого loadHTMLString. На всех версиях до iOS 6 все работает, как и ожидалось, но на iOS 6 это занимает ок. 2 минуты, чтобы загрузить все, что не является текстом. Все изображения и т. д. загружаются каждые 2 минуты, поэтому моя страница загружается примерно за 8 минут. Это работает очень быстро на iOS 5.1 и ниже.

Вот проблема, которую я нашел на сайте, которая объясняет мою проблему, но не имеет ответа: https://devforums.apple.com/message/724010

Мне очень нужен ответ на это.

Когда я делаю пустое приложение, которое делает именно это, все работает, если я помещаю это в приложение, которое работает с сетью до его запуска, возникает проблема. так что это очень сложно изолировать, но, насколько я могу понять UIWebView, я думаю, что проблема связана с baseURL, но это просто ощущение.


person Trausti Thor    schedule 05.10.2012    source источник
comment
Не могли бы вы записать html-файл в каталог документов, а затем загрузить его оттуда?   -  person Ben Clayton    schedule 05.10.2012
comment
Как вы думаете, это помогло бы?   -  person Trausti Thor    schedule 05.10.2012
comment
Да, я так думаю. Мы загружаем оттуда очень большие и сложные HTML-документы, и это очень быстро работает на iOS6 (и iOS5).   -  person Ben Clayton    schedule 05.10.2012
comment
Я изучил это и, возможно, это могло бы решить проблему, но, к сожалению, это невозможно, поскольку компания, у которой есть веб-сайт, хочет иметь возможность изменить веб-сайт в любое время, поэтому все логотипы и тому подобное могут измениться в любое время.   -  person Trausti Thor    schedule 25.10.2012


Ответы (2)


UIWebView немного отличается между iOS 5 и 6 тем, что сообщение

- (BOOL) webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType

отправляется делегату представлений в iOS 6 при вызове loadHTMLString:baseURL:, но это не так в iOS 5. Мой метод делегата

- (BOOL) webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    [[UIApplication sharedApplication] openURL:[request URL]];
    return NO;
}

и кажется, что пустой базовый URL-адрес вызвал загрузку общего приложения. Поскольку это новинка для iOS 6, кажется, что она виновата, возможно, у вас есть что-то подобное. Проверка пустого базового URL-адреса в методе делегата устранила мою проблему. Это не красиво, но это сработало.

- (BOOL) webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    if ( [@"file:///" isEqualToString:[[request URL] absoluteString]] ) {
        return YES;
    }

    [[UIApplication sharedApplication] openURL:[request URL]];
    return NO;
}
person Warren Gavin    schedule 26.10.2012
comment
Я знаю об этом, и это не решило мою проблему - person Trausti Thor; 28.01.2013

Я не уверен, почему это решило мою проблему, но это так.

Контроллер моего представления, который вызывал веб-представление, находился в статической библиотеке, поскольку повторно использовался в других приложениях. Просто переместив код из статической библиотеки в само приложение, приложение стало работать намного лучше, а веб-представление работает так, как можно ожидать сейчас. Больше нет никакой разницы между iOS 5 и iOS 6.

Но добавление этого кода действительно имело огромное значение:

NSHTTPCookie *cookie;
NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (cookie in [storage cookies]) {
    [storage deleteCookie:cookie];
}

Как я уже сказал, я не могу объяснить, почему перенос кода в само приложение вместо того, чтобы иметь его в виде библиотеки, и приведенный выше код работает, но я уверен, что это как-то связано с тем, как кешируется веб-просмотр.

person Trausti Thor    schedule 28.01.2013