Apparently there's a bit of a gotcha according to the iPhone SDK Release Notes for iPhone OS 3.0:
Issue: UIWebView can't load local resources in apps built against 3.0.
When using [UIWebView
loadHTMLString:baseURL:], the HTML
string should not refer to local
resources with the file:// scheme.
Instead, pass in NULL or a file://
URL for baseURL:, or include the
resources directly in the HTML with
<style> and <script> tags.
Fair enough. But passing in a standard-issue file:// URL for baseURL doesn't quite work. However ... it turns out that, if you change / to // and spaces to %20, you will be set! (Using %20 makes a lot of sense, but the double-slash part caught me by surprise.)
Let's say you already have NSString *markup set up. Here's all you do. (I've wrapped the code here for readability. You may wish to refactor/adjust to taste.)
NSString *resourcePath = [[[[NSBundle mainBundle] resourcePath]
stringByReplacingOccurrencesOfString:@"/" withString:@"//"]
stringByReplacingOccurrencesOfString:@" " withString:@"%20"];
[webView loadHTMLString:markup baseURL:[NSURL URLWithString:
[NSString stringWithFormat:@"file:/%@//", resourcePath]]];
So long as your CSS, JavaScript and images are referred to by filename alone, this should do the trick in iPhone OS 3.0 where loadHTMLString:baseURL: is concerned!