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 🙁