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"/>
我正在使用 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"/>