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 死锁的主要内容,如果未能解决你的问题,请参考以下文章
iOS 13 SceneDelegate 上的 WKWebView 警报崩溃