Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 643
Tyler Avatar asked Oct 08 '09 20:10

Tyler


People also ask

What is a manifest file in HTML5?

The manifest file is a simple text file that lists the resources the browser should cache for offline access. To learn more about how to create the manifest file, please read our HTML5 Application Cache chapter.

What does cache do in manifest file?

The CACHE section contains files you want to load and store on the user's machine. The first time the user loads your app, the browser will store all the files in the CACHE section of your app cache manifest.

Should I cache manifest JSON?

Yes you should cache your manifest. json file, because if you a building a PWA, then it must have a functionality to Add to home screen . In your manifest file, it contains a start_url that needs to be cached by service worker and should return a 200 response when offline.


2 Answers

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 :-(

like image 95
Mark Lummus Avatar answered Oct 18 '22 03:10

Mark Lummus


You could use the cachePolicy param on the NSURLRequest.

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

documented here.

like image 36
Eoin Avatar answered Oct 18 '22 02:10

Eoin