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

在 WKWebView DecidePolicy 中获取表单发布响应正文

在 iOS 中 WKWebView 的后台历史显示带有父 URL 的子 URL