Wkwebview - Javascript Confirm And Alert Not Working
Solution 1:
A little late but I would like to add my experience for future reference. The answer of @Bon Bon brought me on the path to the solution while I was trying to make things work with Swift 3 and IOS 10, in which case the code needs some modifications.
Firstly you need to implement also WKUIDelegate, so add it to the ViewController declaration:
classViewController: UIViewController, WKUIDelegate {Then when you instantiate the WKWebView object, as for example like so:
self.webView = WKWebView(frame: self.view.frame)
you need also to assign the correct value to the uiDelegate property of the instance:
self.webView?.uiDelegate = selfThen finally you can use the code provided by @Bon Bon, but note that there are some little differences required by Swift 3, as for example, the name of the presentViewController method becomes present :
funcwebView(_webView: WKWebView, runJavaScriptAlertPanelWithMessagemessage: String, initiatedByFrameframe: WKFrameInfo, completionHandler: @escaping () -> Void) {
let alertController =UIAlertController(title: nil, message: message, preferredStyle: .actionSheet)
alertController.addAction(UIAlertAction(title: "Ok", style: .default, handler: { (action) in
completionHandler()
}))
self.present(alertController, animated: true, completion: nil)
}
funcwebView(_webView: WKWebView, runJavaScriptConfirmPanelWithMessagemessage: String, initiatedByFrameframe: WKFrameInfo, completionHandler: @escaping (Bool) -> Void) {
let alertController =UIAlertController(title: nil, message: message, preferredStyle: .actionSheet)
alertController.addAction(UIAlertAction(title: "Ok", style: .default, handler: { (action) in
completionHandler(true)
}))
alertController.addAction(UIAlertAction(title: "Cancel", style: .default, handler: { (action) in
completionHandler(false)
}))
self.present(alertController, animated: true, completion: nil)
}
funcwebView(_webView: WKWebView, runJavaScriptTextInputPanelWithPromptprompt: String, defaultText: String?, initiatedByFrameframe: WKFrameInfo, completionHandler: @escaping (String?) -> Void) {
let alertController =UIAlertController(title: nil, message: prompt, preferredStyle: .alert)
alertController.addTextField { (textField) in
textField.text = defaultText
}
alertController.addAction(UIAlertAction(title: "Ok", style: .default, handler: { (action) iniflet text = alertController.textFields?.first?.text {
completionHandler(text)
} else {
completionHandler(defaultText)
}
}))
alertController.addAction(UIAlertAction(title: "Cancel", style: .default, handler: { (action) in
completionHandler(nil)
}))
self.present(alertController, animated: true, completion: nil)
}
That made alert, confirmation and text input to work correctly within WKWebView, without any compiler warning in Xcode 8. I'm not an expert Swift programmer, so any useful comment about correctness of the code would be very appreciated.
Solution 2:
You also need to set the uiDelegate on the WKWebView.
import UIKit
import WebKit
classViewController: UIViewController, WKUIDelegate, WKNavigationDelegate {
var wkWebView: WKWebView!
publicoverridefuncviewDidLoad() {
super.viewDidLoad()
wkWebView =WKWebView(frame: view.bounds, configuration: WKWebViewConfiguration())
wkWebView.uiDelegate =self
wkWebView.navigationDelegate =self
view.addSubview(wkWebView!)
let url =URL(string: "https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_alert")!
wkWebView.load(URLRequest(url: url))
}
funcwebView(_webView: WKWebView,
runJavaScriptAlertPanelWithMessagemessage: String,
initiatedByFrameframe: WKFrameInfo,
completionHandler: @escaping () -> Void) {
let alert =UIAlertController(title: nil, message: message, preferredStyle: .alert)
let title =NSLocalizedString("OK", comment: "OK Button")
let ok =UIAlertAction(title: title, style: .default) { (action: UIAlertAction) -> Voidin
alert.dismiss(animated: true, completion: nil)
}
alert.addAction(ok)
present(alert, animated: true)
completionHandler()
}
funcwebView(_webView: WKWebView, didFinishnavigation: WKNavigation!) {
wkWebView.evaluateJavaScript("alert('Hello from evaluateJavascript()')", completionHandler: nil)
}
}
For confirm() and prompt() see the other delegate methods.
Solution 3:
Here is a sample code for various javascript alert implementation in Swift:
It's all about converting info in javascript alert into native UI, and call the completionHandler() to send the user action back to javascript engine.
funcwebView(webView: WKWebView, runJavaScriptAlertPanelWithMessagemessage: String, initiatedByFrameframe: WKFrameInfo, completionHandler: () -> Void) {
let alertController =UIAlertController(title: nil, message: message, preferredStyle: .ActionSheet)
alertController.addAction(UIAlertAction(title: "Ok", style: .Default, handler: { (action) in
completionHandler()
}))
self.presentViewController(alertController, animated: true, completion: nil)
}
funcwebView(webView: WKWebView, runJavaScriptConfirmPanelWithMessagemessage: String, initiatedByFrameframe: WKFrameInfo, completionHandler: (Bool) -> Void) {
let alertController =UIAlertController(title: nil, message: message, preferredStyle: .ActionSheet)
alertController.addAction(UIAlertAction(title: "Ok", style: .Default, handler: { (action) in
completionHandler(true)
}))
alertController.addAction(UIAlertAction(title: "Cancel", style: .Default, handler: { (action) in
completionHandler(false)
}))
self.presentViewController(alertController, animated: true, completion: nil)
}
funcwebView(webView: WKWebView, runJavaScriptTextInputPanelWithPromptprompt: String, defaultText: String?, initiatedByFrameframe: WKFrameInfo, completionHandler: (String?) -> Void) {
let alertController =UIAlertController(title: nil, message: prompt, preferredStyle: .ActionSheet)
alertController.addTextFieldWithConfigurationHandler { (textField) in
textField.text = defaultText
}
alertController.addAction(UIAlertAction(title: "Ok", style: .Default, handler: { (action) iniflet text = alertController.textFields?.first?.text {
completionHandler(text)
} else {
completionHandler(defaultText)
}
}))
alertController.addAction(UIAlertAction(title: "Cancel", style: .Default, handler: { (action) in
completionHandler(nil)
}))
self.presentViewController(alertController, animated: true, completion: nil)
}
Post a Comment for "Wkwebview - Javascript Confirm And Alert Not Working"