在Xamarin.Forms应用程序中离开页面后,Webview不会关闭

问题描述 投票:1回答:1

在我离开webview页面后,我花了很多时间试图弄清楚如何阻止webview处于活动状态。我之所以发现这一点,是因为Google Play商店拒绝了该应用,因为应用程序违反了youtube的条款和服务。这是因为即使页面已经离开,YouTube视频也会在后台继续播放。我正在使用xamarin.forms在.cs文件中创建webview(如下所示)。以下代码是我在应用程序内显示youtube视频频道的方式。这个目前运行跨平台:ios / android。

试过的解决方案

我试过寻找下面的onPause()解决方案:

@Override
protected void onPause() {
    mWebView.onPause();
    super.onPause();
}

但是,xamarin webviews无法访问OnPause()。

我也调查过了

Webview.loadUrl("about:blank"); 

但我不确定如何将其合并到应用程序中,以便每当应用程序离开webview页面时它都会执行。

现行守则

public partial class YoutubePage : ContentPage
{
    public YoutubePage ()
    {
        InitializeComponent();
        WebView webView = new WebView
        {
            Source = new UrlWebViewSource
            {
                Url = "https://www.youtube.com/",
            },
            VerticalOptions = LayoutOptions.FillAndExpand
        };

        this.Content = new StackLayout
        {
            Children =
            {
                webView
            }
        };
    }
}
xamarin webview youtube xamarin.forms xamarin.android
1个回答
1
投票

使用OnDisappearing生命周期事件将WebView设置为空白页:

protected override void OnDisappearing()
{
    webView.Source = "about:page";
    base.OnDisappearing();
}

使用OnAppearing生命周期事件将WebView的源设置回原始内容:

protected override void OnAppearing()
{
    base.OnAppearing();
    webView.Source = "https://youtube.com";
}

这当然会破坏用户体验,如果你想暂停/恢复Android.WebKit.WebView,你可以继承WebViewWebViewRender来添加该功能。

PausableWebView

Interface:

public interface IPausableWebViewRenderer
{
    void Pause();
    void Resume();
}

Xamarin.Forms PausableWebView:

public class PausableWebView : WebView
{
    public IPausableWebViewRenderer Renderer;

    public void Pause()
    {
        if (renderer != null) renderer.Pause();
    }

    public void Resume()
    {
        if (renderer != null) renderer.Resume();
    }
}

Xamarin.Android PausableWebViewRenderer:

public class PausableWebViewRenderer : WebViewRenderer, IPausableWebViewRenderer
{
    Android.Webkit.WebView webView;

    public PausableWebViewRenderer(Android.Content.Context context) : base(context) { }

    protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)
    {
        base.OnElementChanged(e);

        webView = Control;
        if (e.OldElement != null)
            (e.OldElement as PausableWebView).Renderer = null;
        if (e.NewElement != null)
            (e.NewElement as PausableWebView).Renderer = this;
    }

    public void Pause()
    {
        if (webView != null) webView.OnPause();
    }

    public void Resume()
    {
        if (webView != null) webView.OnResume();
    }
}

Example:

XAML:

<local:PausableWebView x:Name="webView" Source="https://youtube.com" VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand" />

OnDisappearing / OnAppearing:

protected override void OnDisappearing()
{
    webView.Pause();
    base.OnDisappearing();
}

protected override void OnAppearing()
{
    base.OnAppearing();
    webView.Resume();
}
© www.soinside.com 2019 - 2024. All rights reserved.