Html5 cache manifest in a UIWebView?
I got this to work using a .manifest file in a UIWebView. I discovered the trick on the Apple developer forums.
you must deliver the proper mime-type for the manifest file: it must be of type "text/cache-manifest" - if it is anything else, then you won't get your files cached.
you can use web-sniffer at http://web-sniffer.net/ to look at the headers returned by your server.
if you are using .htaccess files on your web server, then add the following line to the .htaccess file:
AddType text/cache-manifest .manifest
make sure to clear your browser cache after making this change to see the effect.
HTH Mark
edit: this is only supported on iOS 4.0 and later. You will need to implement your own caching mechanism for iOS 2.x and 3.x :-(
You could use the cachePolicy param on the NSURLRequest.
request = [NSURLRequest requestWithURL:[NSURL URLWithString:reqString] cachePolicy:NSURLRequestReturnCacheDataDontLoad timeoutInterval: 10.0];
documented here.
UIWebView
's cannot (or will not) use the HTML5 appcache. They just don't. Maybe in iPhone OS 4.0.
But what you can do is fetch all the files yourself with network calls (or just have them in your app bundle) and load up the webview with a local URL pointing to your local HTML file, which can have relative URLs to local assets.
There is no super simple "it just works" way to make this happen, however.
Have you tried to create a customised NSURLCache object and use the setSharedURLCache: method, as recommended in the documentation:
"Applications with more specific needs can create a custom NSURLCache object and set it as the shared cache instance using setSharedURLCache:"
I was experiencing the same problem. Although I used:
[NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:30.0];
It didn't seem to want to use the cached data. Meaning it constantly made the request to my webservice to retrieve the latest content and thus made caching useless.
I did find a work-around. When loading the URL in the UIWebView use the following code:
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];
This has been tested on the OS 4.2, since I use the manifest to handle the caching (HTML5). There is a big chance that it won't work on OS 2.x/3.x, thou this needs to be confirmed.
The cons about using this method is that you can't send any POST data with your request.
Hope this helps anyone.
You still need to send the request with 'cachePolicy:NSURLRequestReturnCacheDataElseLoad' else it will still not work.