ios - 监听 WkWebView 的导航事件

标签 ios xamarin

我是 Xamarin 和 iOS 的新手。我正在尝试在 Xamarin Forms 中创建一个自定义渲染器来渲染 WkWebView。我希望当用户点击 web View 中的链接时调用我的 DidStartProvisionalNavigation() 方法,但那没有发生,我不知道为什么。我正在尝试使用 Xlab 的 HybridViewRender作为引用。有人能告诉我如何让 WkWebView 在用户点击链接时调用 DidStartProvisionalNavigation() 吗?谢谢

这是我使用 WkWebView 的自定义 IOS 渲染器的源代码。

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

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

            if (e.PropertyName == "Uri") 
                Control.LoadRequest (new NSUrlRequest (new NSUrl (Element.Uri)));
        }

        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.ApplicationNameForUserAgent += " MethodApp";
                var webView = new WKWebView (Frame, config);

                SetNativeControl (webView);
            }
            if (e.OldElement != null) {
                userController.RemoveAllUserScripts ();
                userController.RemoveScriptMessageHandler ("invokeAction");
                var hybridWebView = e.OldElement as HybridWebView;
                e.OldElement.onRefresh -= Refresh;
                hybridWebView.Cleanup ();
            }
            if (e.NewElement != null) {
                e.NewElement.onRefresh += Refresh;
                //string fileName = Path.Combine (NSBundle.MainBundle.BundlePath, string.Format ("Content/{0}", Element.Uri));
                if (Element.Uri != null) 
                    Control.LoadRequest (new NSUrlRequest (new NSUrl (Element.Uri)));

            }
        }

        public void Refresh(object sender, EventArgs ea) {
            Control.Reload();
        }

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

        [Export("webView:didStartProvisionalNavigation:")]
        public void DidStartProvisionalNavigation(WKWebView webView, WKNavigation navigation)
        {
            Element.OnNavigating(webView.Url);
        }
    }

最佳答案

你只需要添加这一行:

webView.NavigationDelegate = this; 

代码之后:

var webView = new WKWebView (Frame, config);

也不要忘记更改:

public class HybridWebViewRenderer : ViewRenderer< HybridWebView,WKWebView>, IWKScriptMessageHandler, IWKNavigationDelegate

之后,您可以使用并覆盖 DidStartProvisionalNavigation 代码:

[Export("webView:didStartProvisionalNavigation:")]
public void DidStartProvisionalNavigation(WKWebView webView,WKNavigation navigation)
{
// When navigation starts, this gets called
Console.WriteLine("DidStartProvisionalNavigation");
}

关于ios - 监听 WkWebView 的导航事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36436217/

相关文章:

ios - 是否可以直接从自定义键盘扩展访问 Game Center?

Xamarin Android 警告 XA0106,无法删除数百个警告

c# - 如何在 iOS 上打开下载的文件

android - RecyclerView Android 中的 CardView 中的 ViewPager

ios - SWIFT:执行 UIButton 操作时会删除解析数据

ios - 如何在另一个 XCTestCase 子类中使用一个 XCTestCase 子类的辅助方法?

c# - 如何从选项卡式 View Controller 中使用导航 Controller ?

Android App 编译不生成包资源

iphone - 如何在 CustomTableViewCell 的 UILabel 上添加跑马灯效果?

ios - 苹果 map 和 MapKit 使用相同的 API 吗?