Xamarin iOS WKWebView显示JavaScript警报

时间:2016-05-04 17:22:38

标签: javascript xamarin.ios wkwebview

我想在我的WKWebView中显示JavaScript Alert。我已经实现了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 个答案:

答案 0 :(得分:3)

我不确定你在哪里尝试处理动作,无论是在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://stackoverflow.com/a/32690371/5606840。如果要访问视图控制器以显示警报,请在初始化时将其传递到WKUIDelegate类。

修改

扩展如何在javascript中处理结果

alert('This is an alert');

webview将暂停javascript线程并调用RunJavaScriptAlertPanel。单击确定按钮后,它将在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遇到确认方法时,它会调用RunJavaScriptConfirmPanel。然后,您可以显示包含通过消息传递的文本的对话框,以及“确定”和“取消”按钮。根据单击的按钮,该方法会将true或false推送回webview,并允许其余的javascript代码通过完成处理程序执行。