web-dev-qa-db-ja.com

alert()がWKWebviewで機能しないevaluateJavaScript()

私の質問がthis oneの重複としてマークされているのはなぜですか?タイトルは、そのクエシトンと明らかに異なるものを示しています。さらに、質問の本文の最後で成功せずに、その質問の答えを試してみました。

wkwebview.evaluateJavaScript()関数を使用して、Swift3のwkwebviewでJavaScriptを実行します。しかし、alert()はアラートダイアログを開きませんでした。そして、エラーや問題はありません。 evaluateJavaScript()を使用してJavaScriptコードを実行し、ページコンテンツを変更できます。

_class WebViewController: UIViewController, WKScriptMessageHandler, WKNavigationDelegate, WKUIDelegate, UIScrollViewDelegate {
    var wk:WKWebView!
    self.wk.navigationDelegate = self
    self.wk.uiDelegate = self
    self.wk.scrollView.delegate = self
    self.wk.customUserAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:53.0) Gecko/20100101 Firefox/53.0"

    ...
    override func viewDidLoad() {
        super.viewDidLoad()
        ...
        let config = WKWebViewConfiguration()
        self.wk = WKWebView(frame: CGRect(x: frame.minX, y: frame.minY+20, width: frame.width, height: frame.height-70), configuration: config)
        self.wk.navigationDelegate = self
        ...
    }


    ...
    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        print("Finished navigation to url \(String(describing: webView.url))")
        //self.wk.evaluateJavaScript("document.getElementById('test').innerHTML = 'sssssssssssssss';", completionHandler: nil)          //this works well
        self.wk.evaluateJavaScript("alert('aaaaaaa');", completionHandler: nil)     //this not show the alert dialog
    }
    ...
}
_

この post および answer についても言及していますが、その質問はevaluateJavaScriptに関するものではありません。 WKUIDelegateWebViewControllerを追加し、_self.wk.uiDelegate = self_をviewDidLoad()に追加しましたが、何も変わりません。

追加されました、console.log()の下にログがコンソールに置かれますが、alert()はダイアログをポップアップしません。また、UIAlertControllerも機能します。

_self.wk.evaluateJavaScript("alert('aa');console.log('1234');var rect = document.getElementById('liveMovie').getBoundingClientRect();[rect.left, rect.top];") {
    (result, error) -> Void in
    if((result) != nil)
    {
        self.player?.view?.frame.Origin.x = (result as! Array)[0]
        self.player?.view?.frame.Origin.y = (result as! Array)[1]
    }
}

let alertController = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: { (action) in
     if(true)
     {
     }
}))
_
13
Kris Roofe

この答え に実用的な例があります。 WKUIDelegateメソッドを正しく実装していない可能性があります。

4
Onato

まず、必要なWKUIDelegateメソッドを実装する必要があります。この場合、実装する必要があります。

optional func webView(_ webView: WKWebView, 
    runJavaScriptAlertPanelWithMessage message: String, 
         initiatedByFrame frame: WKFrameInfo, 
        completionHandler: @escaping () -> Void)
{
    // parameter **message** will hold your actual alert message.

    // Write Your Customised code to display the alert message
}
3
Jeba Moses

ここは私のせいです。 WKWebviewの経験はあまりありません。私はAndroidのXWalkviewの経験があり、alertを実行すると、Javaコードでalertを実装する必要はありません。したがって、ここでも、Swiftでalertdelegateを実装する必要がないという考えも見逃しました。

オナトの答えから、SwiftがalertPromptconfirmを実行する方法を学びました。これらのデリゲート。だから私は この答え を参照し、以下の実装を追加すると、すべてが機能します。

func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo,
             completionHandler: @escaping () -> Void) {

    let alertController = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet)
    alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: { (action) in
        completionHandler()
    }))

    present(alertController, animated: true, completion: nil)
}


func webView(_ webView: WKWebView, runJavaScriptConfirmPanelWithMessage message: String, initiatedByFrame frame: 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)
    }))

    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: nil, message: Prompt, preferredStyle: .actionSheet)

    alertController.addTextField { (textField) in
        textField.text = defaultText
    }

    alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: { (action) in
        if let text = alertController.textFields?.first?.text {
            completionHandler(text)
        } else {
            completionHandler(defaultText)
        }
    }))

    alertController.addAction(UIAlertAction(title: "Cancel", style: .default, handler: { (action) in
        completionHandler(nil)
    }))

    present(alertController, animated: true, completion: nil)
}
1
Kris Roofe