Xamarin iOS C# Open Links in Safari from UIWebView

2019-04-08 19:24发布

问题:

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

回答1:

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;
}


回答2:

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;


回答3:

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.