Форма Xamarin: WkWebView не загружает сайт - PullRequest
0 голосов
/ 24 марта 2019

Здравствуйте, я использую пример кода из Xamarin (Hybrid WebView)

public class Test : WKNavigationDelegate
{ 
    public override void DidFinishNavigation(WKWebView webView, WKNavigation navigation)
    {

    }
}

public class HybridWebViewRenderer : ViewRenderer<HybridWebView, WKWebView>, IWKScriptMessageHandler
{
    const string JavaScriptFunction = "function invokeCSharpAction(data){window.webkit.messageHandlers.invokeAction.postMessage(data);}";
    WKUserContentController userController;

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

        if (Control == null) {
            userController = new WKUserContentController ();
            var script = new WKUserScript (new NSString (JavaScriptFunction), WKUserScriptInjectionTime.AtDocumentEnd, false);
            userController.AddUserScript (script);
            userController.AddScriptMessageHandler (this, "invokeAction");

            var config = new WKWebViewConfiguration { UserContentController = userController };
            config.WebsiteDataStore = WKWebsiteDataStore.DefaultDataStore;

            var webView = new WKWebView (Frame, config);
            webView.NavigationDelegate = new Test();
            SetNativeControl (webView); 
        }
        if (e.OldElement != null) {
            userController.RemoveAllUserScripts ();
            userController.RemoveScriptMessageHandler ("invokeAction");
            var hybridWebView = e.OldElement as HybridWebView;
            hybridWebView.Cleanup ();
        }
        if (e.NewElement != null) {
            string fileName = Path.Combine (NSBundle.MainBundle.BundlePath, string.Format ("Content/{0}", "index.html"));
            Control.LoadRequest (new NSUrlRequest (new NSUrl (fileName, false))); 


        }
    }

    public void DidReceiveScriptMessage (WKUserContentController userContentController, WKScriptMessage message)
    {
        Element.InvokeAction (message.Body.ToString ());
    }
}

Код может запускать HTML-файл, хранящийся локально в папке содержимого в приложении.Когда я перехожу на новый NSUrlRequest (новый NSUrl ("http://www.google.com", false))); страница пуста.

1 Ответ

0 голосов
/ 25 марта 2019

Решение:

Посмотрите на эту часть кода в пользовательском рендерере:

if (e.NewElement != null) {
        string fileName = Path.Combine (NSBundle.MainBundle.BundlePath, string.Format ("Content/{0}", "index.html"));
        Control.LoadRequest (new NSUrlRequest (new NSUrl (fileName, false)));    
    }

URL здесь объединяет локальный путь в приложении. Таким образом, он успешно загрузит локальный HTML и не будет работать, когда вы измените значение на new NSUrlRequest (new NSUrl ("http://www.google.com", false))).

Итак, если вы хотите загрузить сайт, вы должны изменить код на:

if (e.NewElement != null) {
       //string fileName = Path.Combine (NSBundle.MainBundle.BundlePath, string.Format ("Content/{0}", Element.Uri));
       //Control.LoadRequest (new NSUrlRequest (new NSUrl (fileName, false)));

       //test
       //Control.LoadRequest(new NSUrlRequest(new NSUrl("https://preview.pro.ant.design/user/login")));

       Control.LoadRequest (new NSUrlRequest (new NSUrl (Element.Uri)));    
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...