【问题标题】:How to set WKWebviewConfiguration for a xamarin forms webview?如何为 xamarin 表单 webview 设置 WKWebviewConfiguration?
【发布时间】:2019-08-27 15:31:09
【问题描述】:

我有一个 Xamarin 表单项目,我需要在其中设置某些配置以允许文件访问。在原生 xamarin ios 项目中,它是通过 WKWebviewConfiguration 设置的,如,

_scormWKPreferences = new WKPreferences
            {
                JavaScriptEnabled = true
            };
            ClearCookies();
            _scormWKPreferences.SetValueForKey(NSObject.FromObject(true), (NSString)"allowFileAccessFromFileURLs");
            //  _scormWKPreferences.SetValueForKey(NSObject.FromObject(true), (NSString)"allowUniversalAccessFromFileURLs");
            _scormWKWebconfiguration = new WKWebViewConfiguration();
            _scormWKWebconfiguration.Preferences = _scormWKPreferences;
            _scormWKUserContentController = new WKUserContentController();
            _scormWKUserContentController.AddScriptMessageHandler(this, WKSCRIPT_HANDLER);
            _scormWKWebconfiguration.UserContentController = _scormWKUserContentController;
            CGRect viewRect = new CGRect(0, 0, View.Frame.Width, View.Frame.Height);
            _courseWKWebview = new WKWebView(viewRect, _scormWKWebconfiguration);

我也必须在表单项目中实现相同的目标。目前,我在 iOS 模块中添加了自定义渲染器,但无法设置配置。请在下方找到 CustomRenderer。

[assembly: ExportRenderer(typeof(WebView), typeof(ScholarApp.Droid.Reader.Scorm.ScormCustomRenderer))]
namespace ScholarApp.Droid.Reader.Scorm
{
    public class ScormCustomRenderer : Xamarin.Forms.Platform.iOS.WkWebViewRenderer
    {
        protected override void OnElementChanged(VisualElementChangedEventArgs e)
        {
            base.OnElementChanged(e);
            if (e.OldElement == null && e.NewElement != null)
            {
                WKPreferences wkPreferences = new WKPreferences
                {
                    JavaScriptEnabled = true
                };
                wkPreferences.SetValueForKey(NSObject.FromObject(true), (NSString)"allowFileAccessFromFileURLs");
                WKWebViewConfiguration wkConfig = new WKWebViewConfiguration();
                wkConfig.Preferences = wkPreferences;
                WKWebView wkWebView = new WKWebView(Frame, wkConfig);

            }
        }
    }
}

如何将此配置设置为我的 WebView?

【问题讨论】:

  • 您好,无法将本地内容加载到 WKWebview 是什么意思。您可以显示更多有关本地内容含义的代码。

标签: xamarin.forms xamarin.ios wkwebview xamarin.forms.webview


【解决方案1】:

您也可以尝试通过参数化的WkWebViewRenderer 构造函数传递配置

public class CustomWebViewRenderer : WkWebViewRenderer
{
    static WKWebViewConfiguration CreateConfiguration() => new WKWebViewConfiguration
    {
        Preferences = new WKPreferences
        {
            JavaScriptEnabled = true
        }
    };

    public CustomWebViewRenderer() : base(CreateConfiguration()) { }
}

【讨论】:

  • 非常感谢!这对于最新版本的 iOS 非常有效。
  • @acido 很高兴为您提供帮助!
【解决方案2】:

你可以调整你的渲染器:

 public class MyWebViewRenderer : ViewRenderer<WebView, WKWebView>
    {
        WKWebView _wkWebView;

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

            if (Control == null)
            {
                WKPreferences wkPreferences = new WKPreferences
            {
                JavaScriptEnabled = true
            };
            wkPreferences.SetValueForKey(NSObject.FromObject(true), (NSString)"allowFileAccessFromFileURLs");
            WKWebViewConfiguration wkConfig = new WKWebViewConfiguration();
            wkConfig.Preferences = wkPreferences;
                _wkWebView = new WKWebView(Frame, config);
                SetNativeControl(_wkWebView);
            }
            if (e.NewElement != null)
            {
                Control.LoadRequest(new NSUrlRequest(new NSUrl(Element.Source as UrlWebViewSource).Url)));
            }
        }
    }

【讨论】:

  • 在不使用 WKWebView 的情况下,可以将本地文件从文档文件夹加载到 Forms WebView 中,但是当我添加自定义渲染器并且相应的代码无法将本地内容加载到 WKWebview 中时。
  • 嗯,这是一个不同的问题。你有什么例外吗?
  • 没有没有得到任何异常
猜你喜欢
  • 2019-04-12
  • 2019-10-17
  • 2017-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-07
  • 2019-07-04
  • 2021-11-30
相关资源
最近更新 更多