简体   繁体   中英

Html5 cache manifest in a UIWebView?

I'd like to be able to use the html5 cache manifest to store images locally on an iPhone that is visiting the page via a UIWebView within an app.

I've set up a sample that I think conforms to the specs, and appears to work in safari 4 and mobile safari, but not in my app's UIWebView .

The sample html is set up at http://bynomial.com/html5/clock3.html .

This is very similar to the sample provided in the HTML5 draft standard .

Here is the entire (non-template) code of the sample app I'm using for testing:

- (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];
}

I've reviewed a few related questions on stackoverflow, but they don't seem to provide info to solve this. For example, I'm pretty sure the files I'm trying to cache are not too large, since they are just a couple small text files (way < 25k).

Any ideas for how to get this to work?

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM