Search code examples
iosuiwebviewmobile-safari

UIWebView open links in Safari


I have a very simple UIWebView with content from my application bundle. I would like any links in the web view to open in Safari instead of in the web view. Is this possible?


Solution

  • Add this to the UIWebView delegate:

    (edited to check for navigation type. you could also pass through file:// requests which would be relative links)

    - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
        if (navigationType == UIWebViewNavigationTypeLinkClicked ) {
            [[UIApplication sharedApplication] openURL:[request URL]];
            return NO;
        }
    
        return YES;
    }
    

    Swift Version:

    func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
            if navigationType == UIWebViewNavigationType.LinkClicked {
                UIApplication.sharedApplication().openURL(request.URL!)
                return false
            }
            return true
        }
    

    Swift 3 version:

    func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
        if navigationType == UIWebViewNavigationType.linkClicked {
            UIApplication.shared.openURL(request.url!)
            return false
        }
        return true
    }
    

    Swift 4 version:

    func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebView.NavigationType) -> Bool {
        guard let url = request.url, navigationType == .linkClicked else { return true }
        UIApplication.shared.open(url, options: [:], completionHandler: nil)
        return false
    }
    

    Update

    As openURL has been deprecated in iOS 10:

    - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
            if (navigationType == UIWebViewNavigationTypeLinkClicked ) {
                UIApplication *application = [UIApplication sharedApplication];
                [application openURL:[request URL] options:@{} completionHandler:nil];
                return NO;
            }
    
            return YES;
    }