Xamarin表示Hybridweb查看mailto链接无法正常工作

问题描述 投票:1回答:2

您好我已经在我的xamarin表单pcl项目中实现了混合webview。我有一个html页面,我在其中创建了mailto链接,但它没有点击它,它没有显示找到的网页。

在uwp中,它要求打开应用程序。

Hybridwebview

public class HybridWebView : View
    {
        Action<string> action;

        public static readonly BindableProperty UriProperty = BindableProperty.Create(
            propertyName: "Uri",
            returnType: typeof(string),
            declaringType: typeof(HybridWebView),
            defaultValue: default(string));

        public string Uri
        {
            get { return (string)GetValue(UriProperty); }
            set { SetValue(UriProperty, value); }
        }

        public void RegisterAction(Action<string> callback)
        {
            action = callback;
        }

        public void Cleanup()
        {
            action = null;
        }

        public void InvokeAction(string data)
        {
            if (action == null || data == null)
            {
                return;
            }
            action.Invoke(data);
        }
    }

Droid中的渲染器 -

public class HybridWebViewRenderer : ViewRenderer<HybridWebView, Android.Webkit.WebView>
    {
       const string JavaScriptFunction = "function invokeCSharpAction(data){jsBridge.invokeAction(data);}";
       const string downloadFunction = "function downloadbook(data){jsBridge.invokeDownloadAction(data);}";

        protected override void OnElementChanged(ElementChangedEventArgs<HybridWebView> e)
        {
            base.OnElementChanged(e);
            Android.Webkit.WebView.SetWebContentsDebuggingEnabled(true);

            if (Control == null)
            {
                var webView = new Android.Webkit.WebView(Forms.Context);
                webView.Settings.JavaScriptEnabled = true;

                SetNativeControl(webView);
            }
            if (e.OldElement != null)
            {
                Control.RemoveJavascriptInterface("jsBridge");
                var hybridWebView = e.OldElement as HybridWebView;              
                hybridWebView.Cleanup();
            }
            if (e.NewElement != null)
            {
                Control.AddJavascriptInterface(new JSBridge(this), "jsBridge");
                Control.LoadUrl(string.Format("file:///android_asset/Content/{0}", Element.Uri));
                //string url = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), Element.Uri);
                //Control.LoadUrl(string.Format("file://{0}", url));

                Task.Run(() => {
                    Task.WaitAny(Task.Delay(2000));
                    InjectJS(JavaScriptFunction);
                    CallJS();
                });

            }
        }

        void InjectJS(string script)
        {
            if (Control != null)
            {                  
                Control.LoadUrl(string.Format("Javascript: {0}", script));
            }
        }

        void CallJS()
        {
            if (Control != null)
            {
                try
                {

                }
                catch (Exception ex)
                { }

            }
        }

    }
c# android xamarin xamarin.forms
2个回答
2
投票

您应该订阅OnNavigatingWebView事件并在那里处理mailto链接。

void OnNavigating(object sender, WebNavigatingEventArgs e)
{
    if (e.Url.StartsWith ("mailto")) {
        Device.OpenUri(new Uri(e.Url););
        e.Cancel = true;
    }
}

取消导航非常重要,因为您正在移出应用程序,并且WebView无需再尝试导航。


0
投票

我的webview是混合的。我这次添加了代码。

我找到了你的问题,因为你的HybridWebView继承自View,而不是Xamainr Forms的WebView,你不能订阅WebView的事件。解决您的问题的一种方法是您可以修改您的HybridWebView类以继承WebView

public class HybridWebView : WebView 

如果你使用这种方法,那么你的Control中的HybridWebViewRenderer指的是Android.Webkit.WebView,你不需要创建一个新的。

Navigating事件应该在PCL中订阅,但是如果你想在你的Android项目中做这项工作,你也可以实现自己的WebViewClient并覆盖ShouldOverrideUrlLoading事件。

© www.soinside.com 2019 - 2024. All rights reserved.