从本地 html 内容导航到 link 时,Xamarin Form WebView Android 和 iOS 之间的不同行为

Xamarin Form WebView different behavior between Android and iOS when navigating to link from local html content

当使用 Android 和 iOS 从我的 WebView 打开网站的 link 时,我可以使用 phone 的默认浏览器来完成.但是,当返回应用程序时,使用 Android 我看到了看到原始 WebView 页面的预期和期望的行为,而不是 iOS 我看到了应用程序内部打开的网站。这里 GitHub link 重现行为:https://github.com/irdalan/WebViewTestApp

Android 的行为: 从左到右:

  1. Android点击 link 之前的应用程序 2. 在 Android 上使用默认浏览器导航至 link 3. 从 Android 返回后的应用程序浏览器到 App.

iOS 的行为: 从左到右:

  1. IphoneApp 在点击 link 5. 在 iOS 上使用默认浏览器导航到 link 6. IphoneApp 之后从浏览器返回 App.

编辑:网页视图页面的代码隐藏

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Essentials;
using Xamarin.Forms;

namespace WebViewTestApp
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
            HtmlWebViewSource localhtml = new HtmlWebViewSource();


            string text = "<html><body><h1>Xamarin.Forms</h1><p>Welcome to WebView.<a href= \"https://en.wikipedia.org/wiki/Xamarin\">Xamarin</a></p></body></html>";

           
            localhtml.Html = text.Replace(@"\", string.Empty);
            _webview.Source = localhtml;
            _webview.Navigating += async (s, e) =>
            {
                if (e.Url.StartsWith("http"))
                {
                    try
                    {
                        var uri = new Uri(e.Url);
                        await Launcher.OpenAsync(uri);
                    }
                    catch (Exception ex)
                    {

                    }
                    finally
                    {
                        e.Cancel = true;
                    }

                }
            };
        }
    }
}

尝试延迟 Launcher 调用,以便 Navigating 中的 Cancel 在切换到浏览器之前发生。这应该抑制默认行为,即显示网页 w/i webview 本身的行为。

变化:

await Launcher.OpenASync(uri);

收件人:

Device.BeginInvokeOnMainThread(async () =>
    await Launcher.OpenAsync(uri));

可选:

为了明确表示您希望 Cancel 首先发生,您可以将 e.Cancel = true; 移动到 启动器行之前。然而,这并不是绝对必要的:在您的 Navigating 方法 returns.

之前,BeginInvoke 中的内容不会被执行