Xamarin iOS WKWebView 显示 JavaScript 警报
Posted
技术标签:
【中文标题】Xamarin iOS WKWebView 显示 JavaScript 警报【英文标题】:Xamarin iOS WKWebView showing JavaScript Alert 【发布时间】:2016-05-04 17:22:37 【问题描述】:我想在我的 WKWebView 中显示 javascript 警报。我已经实现了 IWKUIDelegate 及其方法 RunJavaScriptAlertPanel、RunJavaScriptConfirmPanel。这些被称为 JavaScript 警报。我想知道如何处理这些按钮上的按钮和操作。
有没有一种方法可以为所有 JavaScript 警报编写通用 UIAlertView。例如下面我添加了 errorAlert.AddButton("OK");但实际上我不知道按钮的数量和按钮标题。还有如何处理completionHandler动作
[Export ("webView:runJavaScriptConfirmPanelWithMessage:initiatedByFrame:completionHandler:")]
public void RunJavaScriptConfirmPanel (WKWebView webView, String message, WKFrameInfo frame, Action<bool> completionHandler)
Console.WriteLine ("RunJavaScriptConfirmPanel");
UIAlertView errorAlert = new UIAlertView();
errorAlert.Title = "Alert";
errorAlert.Message = message;
errorAlert.AddButton("OK");
errorAlert.Show();
【问题讨论】:
【参考方案1】:我不确定您在哪里尝试处理该操作,无论是在 javascript 中还是在应用程序中使用 C#,所以我会尝试解决这两个问题。简短的回答是,让 javascript 处理它,如果需要,一旦从对话框中做出选择,就从 javascript 调用应用程序。
警报示例
public override void RunJavaScriptAlertPanel(WKWebView webView, string message, WKFrameInfo frame, Action completionHandler)
var alert = UIAlertController.Create("Alert", message, UIAlertControllerStyle.Alert);
alert.AddAction(UIAlertAction.Create("OK", UIAlertActionStyle.Default, null));
//Let javascript handle the OK click by passing the completionHandler to the controller
ViewController.PresentViewController(alert, true, completionHandler);
确认示例
public override void RunJavaScriptConfirmPanel(WKWebView webView, string message, WKFrameInfo frame, Action<bool> completionHandler)
var alert = UIAlertController.Create("Please confirm", message, UIAlertControllerStyle.Alert);
//Let javascript handle the OK click by passing the completionHandler to the controller
alert.AddAction(UIAlertAction.Create("OK", UIAlertActionStyle.Default, action => completionHandler(true)));
//Let javascript handle the Cancel click by passing the completionHandler to the controller
alert.AddAction(UIAlertAction.Create("Cancel", UIAlertActionStyle.Cancel, action => completionHandler(false)));
ViewController.PresentViewController(alert, true, null);
提示示例
public override void RunJavaScriptTextInputPanel(WKWebView webView, string prompt, string defaultText, WKFrameInfo frame, Action<string> completionHandler)
var alert = UIAlertController.Create("Prompt", prompt, UIAlertControllerStyle.Alert);
alert.AddTextField(textfield => textfield.Placeholder = defaultText; );
alert.AddAction(UIAlertAction.Create("OK", UIAlertActionStyle.Default, action => completionHandler(alert.TextFields[0].Text)));
alert.AddAction(UIAlertAction.Create("Cancel", UIAlertActionStyle.Cancel, action => completionHandler(null)));
ViewController.PresentViewController(alert, true, null);
因此,这为您提供了一个如何将按钮点击传回 javascript 的示例。如果您希望 javascript 进行回调,则需要通过从 WKScriptMessageHandler
继承来注册脚本处理程序。这里有一个基本的例子https://forums.xamarin.com/discussion/41777/wkwebview-caching-not-working
请注意,UIAlertView
已被弃用。您可能想改用UIAlertController
。见https://***.com/a/32690371/5606840。如果您想访问视图控制器以显示警报,请在初始化时将其传递给您的 WKUIDelegate
类。
编辑
详细介绍如何在 javascript 中处理结果
alert('This is an alert');
webview 将暂停 javascript 线程并调用 RunJavaScriptAlertPanel
。一旦点击 OK 按钮,它会在 webview 中回调 completionHandler 并执行其余的 javascript 代码。
if (confirm('Do you want to confirm this?'))
//Do some code here when the user clicks ok
else
//Do other code here when the user clicks cancel
与警报示例一样,当javascript 遇到confirm 方法时,它会调用RunJavaScriptConfirmPanel
。然后,您可以显示对话框,其中包含通过消息传递的文本以及“确定”和“取消”按钮。根据单击的按钮,该方法会将 true 或 false 推送回 webview,并允许其余的 javascript 代码通过完成处理程序执行。
【讨论】:
WKWebView 的问题是它不直接显示 JavaScript Alert。我需要添加上述方法以在应用程序中显示警报。不知道你的意思----简短的回答是,让javascript处理它 另外我不知道每个警报有多少按钮和按钮标题。所以我不能像上面显示的那样对其进行硬编码。不知何故,我需要从这些函数或 JavaScript 中获取这些信息 警报只有一个按钮,确认有按钮(确定和取消),提示也只有两个按钮和一个文本框。上面的示例几乎重新创建了对话框,就像期望它们使用本机 ui 控件出现在浏览器中一样。一旦用户单击其中一个按钮,相应的响应将被传回 webview 中的处理程序。以上是关于Xamarin iOS WKWebView 显示 JavaScript 警报的主要内容,如果未能解决你的问题,请参考以下文章
无法在 Xamarin IOS 中捕获 WkWebView 的屏幕
WKWebView CanPerform 上的 Xamarin iOS 死锁
IOS - 来自本地HTML文件的WKWebView中的CORS
在 Xamarin WKWebView 和 UIWebView 之间共享 cookie