【问题标题】:Xamarin: Open Dialer with Tel: Links in WKWebViewXamarin:使用电话打开拨号器:WKWebView 中的链接
【发布时间】:2019-08-20 11:13:19
【问题描述】:

在 WKWebView 中,点击 Tel: 链接(例如:<a href="tel:5555555555"></a>)不会像在 Chrome/Safari 中那样打开带有链接号码的电话拨号器。

我从以下链接查看了解决方案: https://forums.xamarin.com/discussion/103689/after-ios-11-upgrade-wkwebview-does-not-load-my-website

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

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

下面是我的完整代码,其中的更改模仿了上面链接中的想法。我是否有可能通过我的 web 视图的设计方式来实现这一点?

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

【问题讨论】:

    标签: c# xamarin.ios wkwebview


    【解决方案1】:

    通过添加自定义导航委托类来修复它:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-29
      相关资源
      最近更新 更多