2009-10-08 4 views
19

Я хотел бы использовать манифест кэша html5 для хранения изображений локально на iPhone, который посещает страницу через UIWebView в приложении.Кадр манифеста Html5 в UIWebView?

Я настроил образец, который, как мне кажется, соответствует спецификациям, и, похоже, работает в сафари 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).

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

+0

Тайлер, ответ, который вы выбрали, больше не имеет отношения к делу. Вы должны обновить свой выбор до ответа @ iPixFolio, если сможете. –

+0

Будет работать iOS7 и 6. Почему бы не работать в ios8? –

ответ

26

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

Вы должны предоставить надлежащий тип mime для файла манифеста: он должен быть типа «text/cache-manifest» - если это что-то еще, тогда вы не будете кэшировать свои файлы.

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

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

AddType text/cache-manifest .manifest 

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

НТН Марк

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

+0

Очень круто, но iOS4 все еще остается нарушителем транзакций для многих разработчиков. Но шаг в правильном направлении. –

+4

Дополнительный совет для любого, кто ищет: для этого вам не нужен веб-сниффер. Просто запустите сеанс терминала и выполните следующее: 'curl -I http: // YOUR_DOMAIN/PATH/TO/CACHE_MANIFEST' – Ben

+3

Это больше не прерыватель транзакций. –

3

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

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

Задокументировано here.

+0

Это не работает. Вот как я знаю: я создал образец файла с манифестом кэша, и я загрузил этот файл в 3 браузера: (1) Firefox (2) мобильный Safari, (3) UIWebView с использованием NSURLRequestReturnCacheElseLoad (если я использую DontLoad, то он _never_ нагрузки). Затем я изменяю кешированное изображение на сервере. Firefox и Safari правильно отображают старое изображение; мой UIWebView получает новое изображение. – Tyler

+0

Я получил эту работу сегодня (SDK 5). Спасибо – Tiago

1

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

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

+1

Да, у меня есть. Это не приводит к тому, что манифест кэша работает, хотя вы можете использовать эту технику, чтобы попытаться создать свой собственный кеш, но это сложнее, чем кажется, потому что среда NSURL отвергает некоторые кешированные ответы по неизвестным причинам. – Tyler

+0

Я заметил то же самое. Это довольно искусно. –

2

UIWebView не может (или не будет) использовать HTML5 appcache. Они просто этого не делают. Возможно, в iPhone OS 4.0.

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

Не существует супер простого «просто работает», чтобы это произошло.

+3

После долгих исследований я согласен, что простого решения этой проблемы просто нет. Ближайшим, что я мог получить, было реализовать собственный подкласс NSURLCache и установить его как кеш. Однако даже при всем этом я обнаружил, что часто мои кэшированные результаты были отклонены ОС по причинам, которые были непрозрачны для меня. Похоже, что ОС очень разборчив в отношении приема кэшированных ответов, независимо от того, какую политику кэша или другие настройки параметров я попытался. Довольно сложно работать! – Tyler

+0

Ответ ниже указывает, что это может работать в IOS 4.2. –

+0

Получил эту работу в iOS 5.0 –

1

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

[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» иначе он будет по-прежнему не работает.

+0

Что мне нужно сделать, если я загружаю UIWebView из предварительно сгенерированного тела html NSString, который ссылается на файлы, которые мне нужны? В принципе, я предполагаю, что это может быть другой Java-вызов? Есть идеи? – Marius

Смежные вопросы