Xamarin.Forms 3.3 WKWebView внедряет JavaScript - PullRequest
0 голосов
/ 19 декабря 2018

Я перешел по этой ссылке Xamarin.Forms WKWebView , чтобы добавить Javascript в WebView для iOS.Он работал до Xamarin.Forms 3.3.

. В Xamarin.Forms 3.3 пользовательский рендерер по умолчанию для iOS можно изменить с UIWebView на WKWebView.Я следил за изменениями в AssemblyInfo.cs. Xamarin.Forms 3.3.0 .К сожалению, изменения нарушают коды.

Ниже приведены изменения

    //protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
protected override void OnElementChanged(VisualElementChangedEventArgs e)
{
  base.OnElementChanged(e);
  //if (Control == null)
  //{
  userController = new WKUserContentController();
  userController.RemoveAllUserScripts();
  userController.RemoveScriptMessageHandler("invokeAction");
  var script = new WKUserScript(new NSString(JavaScriptFunction), WKUserScriptInjectionTime.AtDocumentEnd, false);
  userController.AddUserScript(script);
  userController.AddScriptMessageHandler(this, "invokeAction");
  //var config = new WKWebViewConfiguration { UserContentController = userController };
  webView = NativeView as WKWebView;
  webView.Configuration.UserContentController = userController;
  webView.WeakUIDelegate = Self;
  view = Element as BibleWebView;
  //webView = (WKWebView)Control;
  //  var cgRect = new CoreGraphics.CGRect(view.X, view.Y, view.WidthRequest, view.HeightRequest);
  //  webView = new WKWebView(cgRect, config)
  //  {
  //    WeakUIDelegate = Self,
  //  };
  //  SetNativeControl(webView);
  //}
  //if (e.OldElement != null)
  //{
  //  userController.RemoveAllUserScripts();
  //  userController.RemoveScriptMessageHandler("invokeAction");
  //  var hybridWebView = e.OldElement as BibleWebView;
  //  hybridWebView.Cleanup();
  //  e.OldElement.ShowPopup -= OnShowPopup;
  //}
  //if (Control != null)
  //{
  //  BibleWebView webview = Element as BibleWebView;
  HtmlWebViewSource htmlSource = (HtmlWebViewSource)view.Source;
  string html = htmlSource.Html;
  webView.LoadHtmlString(new NSString(html), NSBundle.MainBundle.ResourceUrl);
  view.ShowPopup += OnShowPopup;
  //}
}

Старые коды комментируются, а новые коды не комментируются.Любая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 19 декабря 2018

Я использую пользовательский рендерер с Xamarin.Forms 3.3, использующим EvaluateJavaScript для загрузки javascript на загруженную страницу.

HybridWebView - это класс в моем общем проекте, который наследуется от Xamarin.Forms.WebView

Первый вариант

public class HybridWebViewRenderer : ViewRenderer<HybridWebView, WKWebView>
{
    WKUserContentController userController;

    protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        base.OnElementPropertyChanged(sender, e);

        var formsWebView = sender as WebView;

        if (formsWebView != null)
        {
            userController = new WKUserContentController();
            var config = new WKWebViewConfiguration { UserContentController = userController };
            var webView = new WKWebView(Frame, config);

            SetNativeControl(webView);
            Control.AllowsBackForwardNavigationGestures = true;
            Control.NavigationDelegate = new CustomWebViewClient(Element);

            if((formsWebView.Source as UrlWebViewSource) != null)
            {
                string url = System.Web.HttpUtility.UrlPathEncode((formsWebView.Source as UrlWebViewSource).Url);
                Control.LoadRequest(new NSUrlRequest(new NSUrl(url)));
            }
            else if((formsWebView.Source as HtmlWebViewSource) != null)
            {
                Control.LoadHtmlString((formsWebView.Source as HtmlWebViewSource).Html, new NSUrl(""));
            }
        }
    }

    public class CustomWebViewClient : WKNavigationDelegate, INSUrlConnectionDataDelegate
    {
        private HybridWebView _webclient;
        private WKWebView _webView;

        public CustomWebViewClient(HybridWebView webclient)
        {
            _webclient = webclient;
        }

        public override void DidFinishNavigation(WKWebView webView, WKNavigation navigation)
        {
            string allowZoom = @"javascript:
                    var div = document.createElement('div');
                    div.setAttribute('id', 'div1');
                    div.innerHTML = 'Test';
                    document.getElementsByClassName('container')[0].appendChild(div);
                                    div.onclick = document.getElementById('div1').onclick = function() { div.innerHTML = 'Change text'; }";

            webView.EvaluateJavaScript(allowZoom, null);
            _webView = webView;
        }
    }
}

Второй вариант

protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);

            var formsWebView = sender as WebView;

            string allowZoom = @"javascript:
                        var div = document.createElement('div');
                        div.setAttribute('id', 'div1');
                        div.innerHTML = 'Test';
                        document.getElementsByClassName('container')[0].appendChild(div);
                                        div.onclick = document.getElementById('div1').onclick = function() { div.innerHTML = 'Change text'; }";

            if (formsWebView != null)
            {
                userController = new WKUserContentController();

                //Using WKUserScript
                var script = new WKUserScript(new NSString(allowZoom), WKUserScriptInjectionTime.AtDocumentEnd, false);
                userController.AddUserScript(script);

                var config = new WKWebViewConfiguration { UserContentController = userController };
                var webView = new WKWebView(Frame, config);

                SetNativeControl(webView);
                Control.AllowsBackForwardNavigationGestures = true;
                Control.NavigationDelegate = new CustomWebViewClient(Element);

                if((formsWebView.Source as UrlWebViewSource) != null)
                {
                    string url = System.Web.HttpUtility.UrlPathEncode((formsWebView.Source as UrlWebViewSource).Url);
                    Control.LoadRequest(new NSUrlRequest(new NSUrl(url)));
                }
                else if((formsWebView.Source as HtmlWebViewSource) != null)
                {
                    Control.LoadHtmlString((formsWebView.Source as HtmlWebViewSource).Html, new NSUrl(""));
                }
            }
        }
...