WKWebView CanPerform 上的 Xamarin iOS 死锁

Posted

技术标签:

【中文标题】WKWebView CanPerform 上的 Xamarin iOS 死锁【英文标题】:Xamarin iOS deadlock on WKWebView CanPerform 【发布时间】:2020-06-24 17:28:20 【问题描述】:

我的问题是: 在 CanPerform 返回 true 或 false 之前,我需要从 js 中检查一些值,然后才能返回。 这是我的代码:

public class CustomWKWebView : WKWebView
    
        private const string SelectorOne = "One:";

        private const string SelectorTwo = "Two:";

        public CustomWKWebView(CGRect frame, WKWebViewConfiguration configuration) : base(frame, configuration)
        
            _menu = UIMenuController.SharedMenuController;

            _menu.MenuItems = new[]
            
            new UIMenuItem("One", new ObjCRuntime.Selector(SelectorOne)),
            new UIMenuItem("Two", new ObjCRuntime.Selector(SelectorTwo))
        

        public override bool CanPerform(ObjCRuntime.Selector action, NSObject withSender)
        
            /*this is a deadlock*/
            var checkValue = EvaluatejavascriptAsync($"window.getStatus();").Result;
            if (checkValue)
                return true;
            return false;
        
    

我提前感谢大家。并等待您的建议。

【问题讨论】:

【参考方案1】:

你可以试试下面的代码,EvaluateJavaScriptAsync 是一个异步方法,你可以等待它:

public override bool CanPerform(ObjCRuntime.Selector action, NSObject withSender)


    NSObject obj = new NSObject();
    var checkValue = obj;
        
    /*this is a deadlock*/
    Device.BeginInvokeOnMainThread(async () => 
    
         checkValue = await EvaluateJavaScriptAsync($"window.getStatus();");
    );
    
    // check value of checkValue here
    if (...)
        return true;
    return false;

【讨论】:

在这种情况下,将在检查值之前返回。我应该在 CanPerform 返回值之前等待检查结束。 那么你不能在 CanPerform 中等待 EvaluateJavaScriptAsync 方法。您应该在每次操作之前获取 checkValue,然后选择执行或不执行。 我的“window.getStatus();”基于window.getSelection(),在我的情况下,当我长按wkwebview时会调用CanPerform。我想我没有任何地方可以调用 window.getSelection()(在 CanPerform 之前),因为还不能选择 html 文本。 可以在长按前查看数值吗? 不,因为 wkwebview 不提供这样的机会。

以上是关于WKWebView CanPerform 上的 Xamarin iOS 死锁的主要内容,如果未能解决你的问题,请参考以下文章

我如何监控 WKWebview 上的请求?

iOS 13 SceneDelegate 上的 WKWebView 警报崩溃

iPad上的WKWebView水平滚动

为啥我在 iOS 9 上的 WKWebView 中的音频流无法播放?

允许在 WKWebView 上的输入文件中上传文档

在 iOS 10 上的 WKWebView 中打开 PDF 文件时启用捏合缩放手势