Кадр манифеста html5 в UIWebView?
Я хотел бы использовать манифест кэша html5 для локального хранения изображений на iPhone, который посещает страницу с помощью UIWebView
в приложении.
Я установил образец, который, как мне кажется, соответствует спецификациям и, похоже, работает в Safari 4 и мобильном сафари, но не в моем приложении UIWebView
.
Образец html настроен на http://bynomial.com/html5/clock3.html
.
Это очень похоже на образец, представленный в HTML5 draft standard
.
Вот полный (не шаблонный) код примерного приложения, которое я использую для тестирования:
- (void)applicationDidFinishLaunching:(UIApplication *)application {
// I thought this might help - I don't see any difference, though.
NSURLCache* cache = [NSURLCache sharedURLCache];
[cache setDiskCapacity:512*1024];
CGRect frame = [[UIScreen mainScreen] applicationFrame];
UIWebView* webView = [[UIWebView alloc] initWithFrame:frame];
[window addSubview:webView];
NSString* urlString = @"http://bynomial.com/html5/clock3.html";
NSURL* url = [NSURL URLWithString:urlString];
NSURLRequest* request = [NSURLRequest requestWithURL:url];
[webView loadRequest:request];
[window makeKeyAndVisible];
}
Я рассмотрел несколько связанных вопросов о stackoverflow, но они, похоже, не предоставляют информацию для решения этой проблемы. Например, я уверен, что файлы, которые я пытаюсь кэшировать, не слишком велики, так как они всего лишь несколько небольших текстовых файлов (путь < 25k).
Любые идеи о том, как заставить это работать?
Ответы
Ответ 1
Я получил это для работы с использованием файла .manifest в UIWebView. Я обнаружил трюк на форумах разработчиков Apple.
вы должны поставить правильный тип mime для файла манифеста: он должен иметь тип "text/cache-manifest" - если это что-то еще, тогда вы не будете кэшировать свои файлы.
вы можете использовать веб-сниффер в http://web-sniffer.net/, чтобы посмотреть заголовки, возвращенные вашим сервером.
если вы используете файлы .htaccess на своем веб-сервере, затем добавьте следующую строку в файл .htaccess:
AddType text/cache-manifest .manifest
убедитесь, что вы очистили кеш браузера после внесения этого изменения, чтобы увидеть эффект.
НТН
Марк
edit: это поддерживается только в iOS 4.0 и более поздних версиях. Вам понадобится реализовать собственный механизм кеширования для iOS 2.x и 3.x: - (
Ответ 2
Вы можете использовать параметр cachePolicy для NSURLRequest.
request = [NSURLRequest requestWithURL:[NSURL URLWithString:reqString] cachePolicy:NSURLRequestReturnCacheDataDontLoad timeoutInterval: 10.0];
documented здесь.
Ответ 3
UIWebView
не может (или не будет) использовать HTML5 appcache. Они просто этого не делают. Возможно, в iPhone OS 4.0.
Но то, что вы можете сделать, - это получить все файлы самостоятельно с помощью сетевых вызовов (или просто добавить их в свой комплект приложений) и загрузить веб-просмотр с помощью локального URL-адреса, указывающего на ваш локальный HTML файл, который может иметь относительные URL-адреса для локального активов.
Нет супер простого "просто работает", чтобы это произошло.
Ответ 4
Вы пытались создать настраиваемый объект NSURLCache и использовать метод setSharedURLCache:, как это рекомендовано в документации:
"Приложения с более конкретными потребностями могут создавать пользовательский объект NSURLCache и устанавливать его как экземпляр совместно используемого кеша с помощью setSharedURLCache:"
Ответ 5
У меня была та же проблема. Хотя я использовал:
[NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:30.0];
Казалось, он не хочет использовать кэшированные данные. Это постоянно делало запрос на мой вебсервис на получение последнего контента и, таким образом, сделало кеширование бесполезным.
Я нашел работу. При загрузке URL-адреса в UIWebView используйте следующий код:
NSString *html = [NSString stringWithFormat:@"<html><head><script type=\"text/javascript\">location.href='%@';</script></head><body></body></html>", [[currentURLRequest URL] absoluteString]];
[self.webView loadHTMLString:html baseURL:nil];
Это было протестировано на OS 4.2, так как я использую манифест для обработки кэширования (HTML5). Существует большая вероятность, что он не будет работать на OS 2.x/3.x, это нужно подтвердить.
Недостатки использования этого метода заключаются в том, что вы не можете отправлять какие-либо данные POST с вашим запросом.
Надеюсь, это поможет кому угодно.
Вам все равно нужно отправить запрос с помощью 'cachePolicy: NSURLRequestReturnCacheDataElseLoad', иначе он все равно не будет работать.