从本地 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 的行为:
从左到右:
- Android点击 link 之前的应用程序 2. 在 Android 上使用默认浏览器导航至 link 3. 从 Android 返回后的应用程序浏览器到 App.
iOS 的行为:
从左到右:
- 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 中的内容不会被执行
当使用 Android 和 iOS 从我的 WebView 打开网站的 link 时,我可以使用 phone 的默认浏览器来完成.但是,当返回应用程序时,使用 Android 我看到了看到原始 WebView 页面的预期和期望的行为,而不是 iOS 我看到了应用程序内部打开的网站。这里 GitHub link 重现行为:https://github.com/irdalan/WebViewTestApp
Android 的行为: 从左到右:
- Android点击 link 之前的应用程序 2. 在 Android 上使用默认浏览器导航至 link 3. 从 Android 返回后的应用程序浏览器到 App.
iOS 的行为: 从左到右:
- 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.