views:

9227

answers:

11

I have a webview in my iPhone application, and I also have some html files inside my Resources folder. When my app loads, I load in a page from my resources into my webview. But , I need to make links inside my webview that point to some other resources (For example, images, or other html files). Just doing a relative link doesn't work:

<a href="OtherPage.html">Doesn't work</a>
+7  A: 

When you load those resources, you need to set the base URL. You can do this using the method:

- (void)loadHTMLString:(NSString *)string baseURL:(NSURL *)baseURL

...where baseURL would be the file URL of your resources folder.

August
Thanks - but I will accept my answer not yours because it actually solves my problem (with your help). Thanks!
Isaac Waller
You can still do it in 3.0. See jdandrea's answer.
iPhoney
A: 

Take a look at how Phonegap does it. Here's their tutorial on local resources on the iPhone. Step 11 might be what you're neglecting.

ceejayoz
No, I checked all the steps and I did all of them. Thanks anyway.
Isaac Waller
+1  A: 

Try loading OtherPage.html first. If you can't then it's not there, and you've missed some part of adding it to the project. If you can, then there may just be a typo in the link, or the baseURL could be incorrect, as stated by August. When I created an html file with images in it that were in the resource file, it worked fine just using

<img src="file.png">
Ed Marty
No - if I load it directly it works fine.
Isaac Waller
A: 

Maybe it does have something to do with the baseurl: when I load the resources, I use this line:

[webView loadData:htmlData MIMEType:@"text/html" textEncodingName:@"UTF-8" baseURL:[NSURL URLWithString:@""]];

see at the end, it says baseURL: "". If I take this out, it doesn't work (crashes), but I don't know the path to my resources. If somebody does.....?

Isaac Waller
+1  A: 

This code would return a string with the URL of a file named "OtherPage.html" in your bundle's resources directory.

[[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"OtherPage" ofType:@"html"]] absoluteString]
Chris Lundie
+2  A: 

I fixed it: I used this for the BaseURL like August said:

NSString *path = [[NSBundle mainBundle] bundlePath];
NSURL *baseURL = [NSURL fileURLWithPath:path];

Thank you!

Isaac Waller
Doesn't appear to work in iPhone OS 3.0. See my other post for a slight modification!
Joe D'Andrea
A: 

This worked for me. My HTML files were in sub-folders (not groups) in my project. My html page is called page01 and the sub-folder is html:

NSString *resourcePath = [[NSBundle mainBundle] resourcePath];
NSString *pathToHtml = @"html";
NSURL *baseURL = [[NSURL alloc] initFileURLWithPath:pathToHtml isDirectory:YES];

NSString *html = [NSString stringWithContentsOfFile:[[NSBundle mainBundle]    
                             pathForResource:@"page01" ofType:@"html"                     
                             inDirectory:@"html"] 
                         encoding:NSUTF8StringEncoding error:nil];
[webview loadHTMLString:html baseURL:baseURL];
Michael Gaylord
+10  A: 

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!

Joe D'Andrea
Thanks, this works perfect. Nice trick!
iPhoney
works awesome thanks for posting... this should be the right answer
samiq
Y'know … now that I look at what I wrote again, I wonder if I made a faux pas by using "file:/%@//" instead of "file://%@/" ? That might be the inadvertent source of the / to // requirement, in which case it's only a matter of handling spaces, which is standard-issue S/G/HTML stuff. Thoughts? (It has been a while, so if I'm forgetting my own logic here, feel free to correct me - ha!)
Joe D'Andrea
A: 

Hi, I have webview in which i am calling a url ,in this url first screen that appear is a loginscreen and after that next screen appear ,i want to add a logout button on my screen when url next screen appear after login screen.Is it possible how we detect ,when next screen appear .plz give me suggestion.

Monika
A: 

I have a app that plays video's that are in the main bundle path. This used to work (OS3.x) with the base url set as this;

NSString *path = [[NSBundle mainBundle] bundlePath];
NSURL *baseURL = [NSURL fileURLWithPath:path];

But it doesn't work with OS4 (I installed XCode 3.2.3 with SDK 4)

Any ideas?

wiibart
A: 

This is perfect..thanks a lot!!