HTML5 кеш манифест в UIWebView? - PullRequest
       35

HTML5 кеш манифест в UIWebView?

19 голосов
/ 09 октября 2009

Я бы хотел иметь возможность использовать манифест 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, но, похоже, они не предоставляют информацию для решения этой проблемы. Например, я уверен, что файлы, которые я пытаюсь кэшировать, не слишком велики, поскольку они представляют собой всего лишь пару небольших текстовых файлов (размером <25 КБ). </p>

Есть идеи, как заставить это работать?

Ответы [ 5 ]

26 голосов
/ 27 августа 2010

Я получил это для работы с использованием файла .manifest в UIWebView. Я обнаружил хитрость на форумах разработчиков Apple.

вы должны предоставить правильный MIME-тип для файла манифеста: он должен иметь тип "text / cache-manifest" - если это что-то еще, вы не сможете кэшировать ваши файлы.

Вы можете использовать web-sniffer на http://web -sniffer.net / , чтобы посмотреть заголовки, возвращаемые вашим сервером.

если вы используете файлы .htaccess на своем веб-сервере, добавьте следующую строку в файл .htaccess:

AddType text/cache-manifest .manifest

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

НТН Mark

edit: это поддерживается только на iOS 4.0 и более поздних версиях. Вам нужно будет реализовать собственный механизм кэширования для iOS 2.x и 3.x: - (

3 голосов
/ 04 ноября 2009

Вы можете использовать параметр cachePolicy в NSURLRequest.

request = [NSURLRequest requestWithURL:[NSURL URLWithString:reqString] cachePolicy:NSURLRequestReturnCacheDataDontLoad timeoutInterval: 10.0];

задокументировано здесь .

2 голосов
/ 20 января 2010

UIWebView не может (или не будет) использовать кэш приложения HTML5. Они просто нет. Может быть, в iPhone OS 4.0.

Но то, что вы можете сделать, - это самостоятельно извлечь все файлы с помощью сетевых вызовов (или просто включить их в комплект вашего приложения) и загрузить веб-просмотр с локальным URL-адресом, указывающим на ваш локальный HTML-файл, который может иметь относительные URL-адреса к локальным активы.

Однако не существует супер-простого способа «просто работает», чтобы это произошло.

1 голос
/ 03 февраля 2011

У меня была такая же проблема. Хотя я использовал:

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

1 голос
/ 08 декабря 2009

Вы пытались создать настроенный объект NSURLCache и использовать метод setSharedURLCache:, как рекомендовано в документации:

"Приложения с более конкретными потребностями могут создать пользовательский объект NSURLCache и установить его в качестве экземпляра общего кэша с помощью setSharedURLCache:"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...