【发布时间】:2020-10-28 19:10:17
【问题描述】:
我正在使用 Xamarin WebView,并希望让我的 Xamarin 应用在离线时仍能加载网站。
关于离线时 Xamarin Webview 加载网站有什么想法吗?
我一直在寻找这个,我只看到 Java Android WebViews 而没有看到 Xamarin 表单
【问题讨论】:
标签: c# xamarin xamarin.forms webview offline
我正在使用 Xamarin WebView,并希望让我的 Xamarin 应用在离线时仍能加载网站。
关于离线时 Xamarin Webview 加载网站有什么想法吗?
我一直在寻找这个,我只看到 Java Android WebViews 而没有看到 Xamarin 表单
【问题讨论】:
标签: c# xamarin xamarin.forms webview offline
我们可以在 iOS 和 Android 上使用 Custom Renderer 来设置 CacheMode。
创建自定义 WebView
public class MyWebView : WebView
{
public static readonly BindableProperty UrlProperty = BindableProperty.Create(
propertyName: "Url",
returnType: typeof(string),
declaringType: typeof(MyWebView),
defaultValue: default(string));
public string Url
{
get { return (string)GetValue(UrlProperty); }
set { SetValue(UrlProperty, value); }
}
}
有一个 ReturnCacheDataElseLoad 缓存类型 NSUrlRequestCachePolicy 。您可以将值设置为 NSURLRequestReturnCacheDataElseLoad 。
使用现有的缓存数据,无论年龄或到期日期,仅在没有缓存数据时才从原始源加载。
using System.ComponentModel;
using xxx;
using xxx.iOS;
using Foundation;
using UIKit;
using WebKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
[assembly:ExportRenderer(typeof(MyWebView),typeof(MyWebViewRenderer))]
namespace xxx.iOS
{
public class MyWebViewRenderer : ViewRenderer<MyWebView, WKWebView>
{
WKWebView _wkWebView;
protected override void OnElementChanged(ElementChangedEventArgs<MyWebView> e)
{
base.OnElementChanged(e);
if (Control == null)
{
var config = new WKWebViewConfiguration();
_wkWebView = new WKWebView(Frame, config);
SetNativeControl(_wkWebView);
}
}
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
if (e.PropertyName == "Url")
{
NSUrlRequest request = new NSUrlRequest(new NSUrl(Element.Url), NSUrlRequestCachePolicy.ReturnCacheDataElseLoad, 5);
Control.LoadRequest(request);
}
}
}
}
using Android.Content;
using xxx;
using xxx.Droid;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
[assembly: ExportRenderer(typeof(MyWebView), typeof(MyWebViewRenderer))]
namespace xxx.Droid
{
public class MyWebViewRenderer : WebViewRenderer
{
public MyWebViewRenderer(Context context) : base(context)
{
}
protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
{
base.OnElementChanged(e);
if(Control!=null)
{
Control.Settings.CacheMode = Android.Webkit.CacheModes.CacheElseNetwork;
Control.Settings.JavaScriptEnabled = true;
}
}
}
}
现在你只需要像下面这样在 xaml 中定义它
<local:MyWebView Url="xxx" />
【讨论】:
我在 Android 自定义渲染器中添加了 Control.LoadUrl(((MyWebView)Element).Url); 行,否则不会显示 url。 OnElementPropertyChanged if(e.property==url) 也不是真的我将此块移动到 iOS 渲染器中的 OnElementChanged 方法。
【讨论】: