Xamarin.Forms でキャッシュされない WebView を作ってみた

Xamarin.Forms でキャッシュされない WebView を作ってみました.

開発環境

  • Visual Studio Community 2017 Version 15.4.1
  • Xamarin 4.7.10.22 (fe36bec)
  • Xamarin.Android 8.0.0.33 (HEAD/7a6a056e8)
  • Xamarin.iOS 11.2.0.8 (9a9f054)

PCL

using Xamarin.Forms;

namespace WebViewSample
{
    class NoCachedWebView : WebView
    {
    }
}

WebView を拡張した NoCachedWebView を作ります.

XAML での使い方は通常の WebView と変わらず.

Android

using Xamarin.Forms;
using WebViewSample.Droid;
using Xamarin.Forms.Platform.Android;

[assembly: ExportRenderer(typeof(WebView), typeof(NoCachedWebViewRenderer))]
namespace WebViewSample.Droid
{
    class NoCachedWebViewRenderer : WebViewRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs e)
        {
            base.OnElementChanged(e);
            if (Control == null) return;

            Control.ClearCache(true);
            Control.Settings.SetAppCacheEnabled(false);
            Control.Settings.CacheMode = Android.Webkit.CacheModes.NoCache;
        }
    }
}

Custom Renderer でキャッシュを無効化する処理を書きます.

iOS

【10/29 更新】
@_shunsuke_kawai さんにアドバイスをいただき、全面的に修正しました.

using System;

using Foundation;
using UIKit;
using Xamarin.Forms.Platform.iOS;
using Xamarin.Forms;
using WebViewSample.iOS;

[assembly: ExportRenderer(typeof(WebView), typeof(NoCachedWebViewRenderer))]
namespace WebViewSample.iOS
{
    class NoCachedWebViewRenderer : WebViewRenderer
    {
        protected override void OnElementChanged(VisualElementChangedEventArgs e)
        {
            base.OnElementChanged(e);
            if (Element == null) return;

            NSUrlCache.SharedCache.RemoveAllCachedResponses();
            NSUrlCache.SharedCache.MemoryCapacity = 0;
            NSUrlCache.SharedCache.DiskCapacity = 0;
        }
    }
}

iOS も Android と同じように Custom Renderer でキャッシュを無効化する処理を書きます.

以上です.

参考

Xamarin.iOS で UIWebView から C# のコードを呼び出す方法
Installed 5.9 (Build 431) — “Event registration is overwriting existing delegate…” error