Подтвердить что ты не робот

Кадр манифеста 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).

Любые идеи о том, как заставить это работать?

4b9b3361

Ответ 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', иначе он все равно не будет работать.