Xamarin.macOS 中 WebView 调用的是什么类型的浏览器?

What type of browser is called on WebView in Xamarin.macOS?

我正在使用 Xamarin.Forms 创建一个 Mac 应用程序。我有一个跨平台项目,其中我有一个带有 webview 的主页和一个 cocoa mac 项目作为应用程序的入口点。 我试图在 webview 页面中打开 gmail 或什么是应用程序 web 但内部的浏览器似乎不受支持:

下面是代码和截图。

MainPage.xaml

<Grid
    BackgroundColor="Aqua">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <StackLayout
                Grid.Column="0"
                Orientation="Vertical">
                <Image
                    HorizontalOptions="Center"
                    HeightRequest="50"
                    Aspect="AspectFit"
                    x:Name="WhatsAppButton"
                    Source="whatsapp.png">
                    <Image.GestureRecognizers>
                        <TapGestureRecognizer Tapped="WhatsAppButton_OnClicked"/>
                    </Image.GestureRecognizers>
                </Image>
        </StackLayout>
        <WebView
            x:Name="MainWebView"
            Grid.Column="1"/>
</Grid>

MainPage.xaml.cs

private void WhatsAppButton_OnClicked(object sender, EventArgs e)
{
    var webViewSource = new UrlWebViewSource();
    webViewSource.Url = "https://web.whatsapp.com/";
    this.MainWebView.Source = webViewSource;
}

下图为结果:

image

如果是这样的话,有没有办法在 webview 中使用更新的浏览器?

我设法通过定义继承自 WkWebView 的自定义呈现器来编辑默认用户代理。 WkWebView 有一个名为 CustomUserAgent 的 属性,这正是我所需要的。

所以这是自定义渲染器:

using Foundation;
using SuperWrapper.CustomRenderers;
using SuperWrapper.macOS.CustomRenderers;
using WebKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.MacOS;

[assembly: ExportRenderer (typeof(SuperWebView), typeof(SuperWebViewRenderer))]
namespace SuperWrapper.macOS.CustomRenderers
{
    public class SuperWebViewRenderer : ViewRenderer<SuperWebView, WKWebView>
    {
        private WKWebView _wkWebView;
        protected override void OnElementChanged(ElementChangedEventArgs<SuperWebView> e)
        {
            base.OnElementChanged(e);

            if (this.Control == null)
            {
                var config = new WKWebViewConfiguration();
                this._wkWebView = new WKWebView(this.Frame, config);
                this.SetNativeControl(this._wkWebView);
            }
            if (e.NewElement != null)
            {
                var source = (UrlWebViewSource) e.NewElement.Source;
                if(source != null)
                    this.Control.LoadRequest(new NSUrlRequest(new NSUrl(source.Url)));
                this.Control.CustomUserAgent = e.NewElement.UserAgent;
            }
        }
    }
}

这是自定义 class 与 "overriding" 属性:

public class SuperWebView : WebView
{
    public static readonly BindableProperty UserAgentProperty = BindableProperty.Create(
        propertyName: "UserAgent",
        returnType: typeof(string),
        declaringType: typeof(SuperWebView),
        defaultValue: default(string));

    public string UserAgent
    {
        get { return (string) GetValue(UserAgentProperty); }
        set { SetValue(UserAgentProperty, value); }
    }
}

出于我的目的,我找到了 Safari 上的用户代理并将其粘贴到 UserAgent 属性。

<customRenderers:SuperWebView
            x:Name="MainWebView"
            Source="https://web.whatsapp.com/"
            UserAgent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36"
            Grid.Column="1"/>