今日も引き続きテキスト漫画のガワネイティブアプリ化です。
ガワネイティブアプリでWebを表示するのに多用されるWKWebViewですが、JavaScriptのalert,confirm,promptに関してはデフォルトで何も表示してくれません。
alert,confirm,promptのダイアログを表示させるには UIAlertAction で適切に処理してあげる必要があります。
と言っても定型でほぼ処理コードは決まっているため、以下のように書いてあげれば大丈夫です。Swift4のコードです。
import UIKit
import WebKit
class ViewController: UIViewController, WKUIDelegate {
private var _webView : WKWebView!
〜略〜
override func viewDidLoad() {
super.viewDidLoad()
〜略〜
_webView.uiDelegate = self
〜略〜
}
func webView(_ _webView: WKWebView, runJavaScriptAlertPanelWithMessage alert: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void) {
let alertController = UIAlertController(title: "", message: alert, preferredStyle: .alert)
let otherAction = UIAlertAction(title: "OK", style: .default) {
action in completionHandler()
}
alertController.addAction(otherAction)
self.present(alertController, animated: true, completion: nil)
}
func webView(_ _webView: WKWebView, runJavaScriptConfirmPanelWithMessage confirm: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (Bool) -> Void) {
let alertController = UIAlertController(title: "", message: confirm, preferredStyle: .alert)
let cancelAction = UIAlertAction(title: "Cancel", style: .cancel) {
action in completionHandler(false)
}
let okAction = UIAlertAction(title: "OK", style: .default) {
action in completionHandler(true)
}
alertController.addAction(cancelAction)
alertController.addAction(okAction)
self.present(alertController, animated: true, completion: nil)
}
func webView(_ _webView: WKWebView, runJavaScriptTextInputPanelWithPrompt prompt: String, defaultText: String?, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (String?) -> Void) {
let alertController = UIAlertController(title: "", message: prompt, preferredStyle: .alert)
alertController.addTextField { (textField) in
textField.text = defaultText
}
alertController.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: { (action) in
completionHandler(nil)
}))
alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: { (action) in
if let textField = alertController.textFields?.first?.text {
completionHandler(textField)
} else {
completionHandler(defaultText)
}
}))
self.present(alertController, animated: true, completion: nil)
}
〜略〜
}
_,,..,,,,_
/ ,’ 3 `ヽーっ
l ⊃ ⌒_つ
`’ー—‐””'”