Какой тип браузера вызывается в WebView в Xamarin.macOS? - PullRequest
0 голосов
/ 30 октября 2019

Я создаю приложение Mac с Xamarin.Forms. У меня есть кроссплатформенный проект, в котором у меня есть главная страница с веб-представлением и проект Cocoa Mac в качестве точки входа в приложение. Я пытаюсь открыть страницы веб-просмотра в виде gmail или веб-приложения, но браузер внутри них не поддерживается:

Ниже кода и снимка экрана.

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

Есть ли способиспользовать более новый браузер в веб-представлении, если это так?

1 Ответ

0 голосов
/ 02 ноября 2019

Мне удалось отредактировать пользовательский агент по умолчанию, определив пользовательский рендер, который наследует от 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;
            }
        }
    }
}

, а это пользовательский класс со свойством «переопределения»:

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"/>
...