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