Xamarin:使用电话打开拨号器:WKWebView 中的链接

Xamarin: Open Dialer with Tel: Links in WKWebView

在 WKWebView 中,单击电话:links(示例:<a href="tel:5555555555"></a>)不会打开 phone 拨号器,其中的号码来自 link 作为他们在 Chrome/Safari.

我查看了下面 link 中的解决方案: https://forums.xamarin.com/discussion/103689/after-ios-11-upgrade-wkwebview-does-not-load-my-website

但是,在我的 C# 项目中,我无法在我的 class 中使用两个基 classes(UIViewController、WKNavigationDelegate),因为我的 class WebViewController 不能有多个基 classes.

是否可以在 DidFinishNavigation 方法中执行此操作以在单击 Tel: links 时打开拨号程序?

下面是我的完整代码,其中的更改模仿了上面 link 的想法。我可以通过我的网络视图设计方式实现这一目标吗?

 [Register("WebViewController")]
 public class WebViewController : UIViewController
  {
    public override void ViewDidLoad()
    {
        base.ViewDidLoad();
        WKWebView webView = new WKWebView(View.Frame, new 
        WKWebViewConfiguration());
        View.AddSubview(webView);
        View.SendSubviewToBack(webView);
        webView.AutoresizingMask = UIViewAutoresizing.FlexibleDimensions;
        var url = new NSUrl("link goes here");
        var request = new NSUrlRequest(url);
        webView.LoadRequest(request);
        webView.AllowsBackForwardNavigationGestures = true;

    }

    public override void ViewWillAppear(bool animated)
    {
        base.ViewWillAppear(animated);
        NavigationController.NavigationBarHidden = true;
    }

    //open email and tel links
    // https://forums.xamarin.com/discussion/103689/after-ios-11-upgrade-wkwebview-does-not-load-my-website
    //https://forums.xamarin.com/discussion/47335/how-to-call-a-set-phone-number-from-a-button-click-using-xamarin-ios


    [Export("webView:didFinishNavigation:")]
    //[Export("webView:decidePolicyForNavigationAction:decisionHandler:")]
    void DidFinishNavigation(WKWebView webView, WKNavigation navigation, WKNavigationAction navigationAction, Action<WKNavigationActionPolicy> decisionHandler)
    {
        var navType = navigationAction.NavigationType;
        var targetFrame = navigationAction.TargetFrame;

        var url = navigationAction.Request.Url;
        if (
               (url.ToString().StartsWith("http") && targetFrame == null)
               ||
               url.ToString().StartsWith("mailto:")
               || url.ToString().StartsWith("tel:")
               || url.ToString().StartsWith("Tel:"))
        {
            UIApplication.SharedApplication.OpenUrl(url);
        }
     }
    }
  }

已通过添加自定义导航委托修复它 class:

   public override void ViewDidLoad()
    {
        base.ViewDidLoad();
        WKWebView webView = new WKWebView(View.Frame, new WKWebViewConfiguration());
        View.AddSubview(webView);
        View.SendSubviewToBack(webView);
        webView.AutoresizingMask = UIViewAutoresizing.FlexibleDimensions;
        var url = new NSUrl("link");
        var request = new NSUrlRequest(url);
        webView.LoadRequest(request);
        webView.AllowsBackForwardNavigationGestures = true;
        //assign delegate
        webView.NavigationDelegate = new MyWKNavigationDelegate();
    }

 //custom delegate
 class MyWKNavigationDelegate : WKNavigationDelegate
 {

    [Export("webView:decidePolicyForNavigationAction:decisionHandler:")]
    public override void DecidePolicy(WKWebView webView, WKNavigationAction 
    navigationAction, Action<WKNavigationActionPolicy> decisionHandler)
    {

        var navType = navigationAction.NavigationType;
        var targetFrame = navigationAction.TargetFrame;

        var url = navigationAction.Request.Url;
        if (
            url.ToString().StartsWith("http") && (targetFrame != null && 
        targetFrame.MainFrame == true)
            )
        {
            decisionHandler(WKNavigationActionPolicy.Allow);
        }
        else if (
            //(url.ToString().StartsWith("http") && targetFrame == null)
            //||
            url.ToString().StartsWith("mailto:")
            || url.ToString().StartsWith("tel:")
            || url.ToString().StartsWith("Tel:"))
        {
            //decisionHandler(WKNavigationActionPolicy.Allow);

                UIApplication.SharedApplication.OpenUrl(url);         
        }

    }
 }