Published Friday 27 January 2012
Categories: Apple | Projects |

Share this Share on Facebook Share on Twitter Share on Google Plus
Post View Counter 389

After working on updates for our Virtual Swanage iOS app that uses a JavaScript based webview for information, I ran into a problem where by a JavaScript window.location event would only open up a page within an existing view and it was not possible to make a URL jump out of an application and into Safari without resorting to <a> links. I came up with the following solution to get around this problem.

The code below should be placed in your iOS application within the same class as your webview. When a link on a web page is selected the shouldStartLoadWithRequest method is called. The URL request is checked and if the URL contains safari:// or safaris:// instead of http:// or https:// the method overrides the default loading action and passes the URL to safari instead.

By using this method you only need to update any URLs on your website that you want to open in Safari with safari:// instead of http:// or safaris:// instead of https://.

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType {
 //CAPTURE USER LINK-CLICK.
    NSURL *url = [request URL];
    NSString *currentURL = [url absoluteString];
    NSRange textRange = [currentURL rangeOfString:@"safari://"];
    NSRange textRangeSecure = [currentURL rangeOfString:@"safaris://"];
    if((textRange.location != NSNotFound) || (textRangeSecure.location != NSNotFound))
    {        
      NSString *newURL;
       if(textRange.location != NSNotFound){
          newURL= [currentURL stringByReplacingOccurrencesOfString:@"safari://" withString:@"http://"];
       }
       if(textRangeSecure.location != NSNotFound){
          newURL= [currentURL stringByReplacingOccurrencesOfString:@"safaris://" withString:@"https://"];
       }
       url = [NSURL URLWithString:newURL];
       [[UIApplication sharedApplication] openURL:url];
       return NO; 
    }
     else{
       return YES;   
   }
 }
 

Permalink


0 Comments



Post your comment