views:

240

answers:

2

My app features content that (for text formatting reasons) is presented in an UIWebView. Within the content there are links, some of which should open their target in mobile Safari, while others should navigate within the content.

So far, I've catched the link requests using a UIWebView delegate. In my implementation of

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType

I'd check the requests URL using lastPathComponent or pathComponents for known elements to determine whether to open the link externally or within the view.

However, I just found out said methods are only available since iOS 4.0, which would render the app useless on iPad. Plus I have the feeling I'm using a dirty solution here.

Is there another way to somehow "mark" the links within my content in a way that makes them easy to distinguish later, when processing the request in the delegate method?

Thanks alot!!

A: 

You should set a policy delegate of web view: For instance in the controller, that contains a web view

[webView setPolicyDelegate:self];

and then override a decidePolicyForNavigation method (this is just an example):

- (void)webView:(WebView *)sender decidePolicyForNavigationAction: (NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id <WebPolicyDecisionListener>)listener
{       
    if ([[actionInformation objectForKey:WebActionNavigationTypeKey] intValue]  == WebNavigationTypeLinkClicked) {
        [listener ignore];
        [[NSWorkspace sharedWorkspace] openURL:[request URL]];
    }
    else
        [listener use];
}

you can distinguish there kind of link and ignore or use the listener. If you ignore it, you can open the link in safari, if you use it, the link will open in your webview.

HTH

Nava Carmon
It appears to me this will only work on mac, not on iPhone...
Toastor
Replace the NSWorkspace bits with the UIApplication sharedApplication. UIApplication has an openURL: method as weep. Checkmthe UIApplication header.
Chris Parker
right, sorry, this example was from mac application, use openURL of sharedApplication as Chris Parker wrote
Nava Carmon
A: 

You could covert the URL request into a string, and do a compare for a subdirectory on your website, such as in URLs that only start with "http://www.sample.com/myapp/myappswebcontent/", against the initial substring of your URL. Anything else, send to Safari.

hotpaw2