如何查找 URL 是否已在 Xamarin 上的 IOS 中的自定义混合 Web 视图中完成加载



我正在处理xamarin表单HCHybridWebview,我的目标是在URL完全加载到IOS上后捕获事件。我的代码如下。

这部分是根据文档制作的

  [assembly: ExportRenderer (typeof(HCHybridWebview), typeof(HCHybridWebviewRendererIos))]
namespace HashChing.iOS.CustomRenderers
   {
    public class HCHybridWebviewRendererIos : ViewRenderer<HCHybridWebview, WKWebView>, IWKScriptMessageHandler
    {
    public StorageService storageService => DependencyService.Get<StorageService>() ?? new StorageService();
    const string JavaScriptFunction = "function invokeCSharpAction(data){window.webkit.messageHandlers.invokeAction.postMessage(data);}";
    WKUserContentController userController;
    protected override void OnElementChanged (ElementChangedEventArgs<HCHybridWebview> 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 };
            var webView = new WKWebView (Frame, config);
            SetNativeControl (webView);
        }
        if (e.OldElement != null) {
            userController.RemoveAllUserScripts ();
            userController.RemoveScriptMessageHandler ("invokeAction");
            var hybridWebView = e.OldElement as HCHybridWebview;
            hybridWebView.Cleanup ();
        }
        if (e.NewElement != null) {
            var hybridView = e.NewElement as HCHybridWebview;
            if(hybridView != null)
            {
                hybridView.RefreshView += LoadUrl;
            }
            //string fileName = Path.Combine (NSBundle.MainBundle.BundlePath, string.Format ("Content/{0}", Element.Uri));
        }
     }

在同一个类中,这是我加载 URL 的地方

    public void LoadUrl(object sender, EventArgs e)
    {
        var webview = (HCHybridWebview)sender;
        var req = new NSMutableUrlRequest(new NSUrl(webview.weblink));
        NSMutableDictionary dic = new NSMutableDictionary();
        dic.Add(new NSString("Authorization"), new NSString("Bearer " + storageService.GetData<Token>("Token").token));
        req.Headers = dic;
        Control.LoadRequest(req);
    }
    public void DidReceiveScriptMessage (WKUserContentController userContentController, WKScriptMessage message)
    {
        Element.InvokeAction (message.Body.ToString ());
    }
  }
}

任何帮助将不胜感激

解决方案:

您可以在方法 DidFinishNavigation 中实现它

public class HCHybridWebviewRendererIos : ViewRenderer<HCHybridWebview, WKWebView>, IWKScriptMessageHandler,IWKNavigationDelegate
protected override void OnElementChanged (ElementChangedEventArgs<HCHybridWebview> 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 };
        var webView = new WKWebView (Frame, config);
        webview.WeakNavigationDelegate=this;
        SetNativeControl (webView);
    }
}

[Export("webView:didFinishNavigation:")]
public void DidFinishNavigation(WKWebView webView, WKNavigation navigation)
{
  if(!webView.IsLoading)
  {
     // do some thing you want
  }
}

最新更新