Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Xamarin iOS C# Open Links in Safari from UIWebView

I'm coding an iPhone app with a UIWebView, in Xamarin using C#.

By default embedded links within the web view open a web page in that same web view. I would instead like them to launch the linked page in a new safari browser instance.

This has been answered for objective C in X-Code but as far as I can see not for Xamarin C#

webView.LoadHtmlString(html, new NSUrl(Const.ContentDirectory, true));

Thanks in advance

Adam

like image 521
Adam Diament Avatar asked Feb 18 '14 10:02

Adam Diament


3 Answers

You can open a web page in the brower of the device (Safari) with this command.

UIApplication.SharedApplication.OpenUrl(new NSUrl("www.google.com"));

You don't have to use UIWebView at all. If you want to open some web pages in UIWebView and some with Safari you need to implement the ShouldStartLoad delegate. Here you can determine whether to open the web page in UIWebView or rather in Safari.

private bool HandleShouldStartLoad(UIWebView webView, NSUrlRequest request, UIWebViewNavigationType navigationType)
{
    // you need to implement this method depending on your criteria
    if (this.OpenInExternalBrowser(request))
    {
        // open in Safari
        UIApplication.SharedApplication.OpenUrl(request.Url);
        // return false so the UIWebView won't load the web page
        return false;
    }

    // this.OpenInExternalBrowser(request) returned false -> let the UIWebView load the request
    return true;
}

At last somewhere in ViewDidLoad (or other place where you initiliaze the WebView) add the following code.

webView.ShouldStartLoad = HandleShouldStartLoad;
like image 123
Norbert Szenasi Avatar answered Oct 29 '22 19:10

Norbert Szenasi


If loading content into a UIWebView and you want to use Safari to open links, doing it the way described above will get you a blank page. You need to check the NavigationType.

private bool HandleShouldStartLoad(UIWebView webView, NSUrlRequest request, UIWebViewNavigationType navType)
{
  if (navType == UIWebViewNavigationType.LinkClicked)
  {
    UIApplication.SharedApplication.OpenUrl(request.Url);
    return false;
  }
    return true;
}
like image 29
Davo Avatar answered Oct 29 '22 18:10

Davo


The easiest/simplest way to do it is to assign a delegate to the UIWebView's ShouldStartLoad property:

webView.ShouldStartLoad = (w, urlRequest, navigationType) => {

    // Open the url in Safari here.
    // The urlRequest parameter is of type NSUrlRequest, you can get the URL from it.
    return false; //return true for urls you actually want your web view to load.

};

Make sure the delegate returns false, for the links you want to load in Safari, so that your UIWebView does not load the link.

like image 2
Dimitris Tavlikos Avatar answered Oct 29 '22 18:10

Dimitris Tavlikos