Xamarin.iOS WebView在第10次重新加载后消失

问题描述

我在Xamarin中获得了基本的WebView。表单如下:

<WebView AbsoluteLayout.LayoutBounds="0,1,1" AbsoluteLayout.LayoutFlags="All" x:Name="ChartWebView" Style="{StaticResource BackgroundStyle}">
     <WebView.source>
          <HtmlWebViewSource Html="{Binding ChartHTML}" />
     </WebView.source>
</WebView>

我使用WebView来显示Chart.js图表​​,该图表工作得很好。在我的页面上,我有一个按钮,用户可以在其中请求数据。

private async Task RequestData()
{
    //Doing some stuff to get data ...
    BuildChartHTML();
}

private void BuildChartHTML()
{
    var html = GetChartJSConfigString();
    Device.BeginInvokeOnMainThread(() =>
    {
        ChartWebView.source = new HtmlWebViewSource
        {
            Html = html
        };
    });
}

但是,仅在iOS上,每次恰好在第10次请求/重新加载时,WebView都会变为空白。之后,它也保持空白。我需要重新导航至此页面才能重新启动并运行。我尝试按照this线程中所述调整WebView.Navigated上的高度,但没有成功。

在具有相同代码库的Android上不会出现此问题。

如果这是框架错误,请打开任何解决方法

PS:很明显,我确保所加载的html没有损坏。我加载了10次相同的数据,并比较了WebView损坏的第10次加载的html。它是完全相同的HTML字符串。

解决方法

原来是iOS WKWebView和使用HTML canvas(chart.js在画布上渲染)的问题。

在调试到我的WebView(愚蠢的我之前没有考虑过这种可能性)之后,我发现画布内存超出了限制。在发布的here解决方案的帮助下,我设法避免了这个问题。

请记住,此解决方案有些棘手。基本上,正如上面的链接中所指出的,我所做的就是每次重新加载图表时都会“删除”画布。 “删除”是指将画布设置为width,将height设置为零。将解决方案应用于我的代码,如下所示:

在我在浏览器中运行的javascript中,我添加了如下功能:

function deleteCanvas() {
    //Get the main canvas where the chart is rendered to
    var chart = document.getElementById('chart'); 
    chart.height = 0;
    chart.width = 0;
}

然后每次我调用BuildChartHTML()函数时,我都会在C#代码中调用此方法,如下所示:

Device.BeginInvokeOnMainThread(() =>
{
    ChartWebView.Source = new HtmlWebViewSource
    {
       Html = html
    };
    ChartWebView.Eval("deleteCanvas()");
});