2015-12-09 63 views
6

WKWebViewを使用してexample.comを開き、そこにJSアラートを開くテストリンクがありますが、表示することができません私はブラウザからサイトを表示する場合にのみ動作します。WKWebView - Javascriptの確認とアラートが機能しない

私はWKUIDelegateを使用して、そしてViewController.swiftファイルにコードのこの部分を追加しています:私はJSアラートを生成しますリンクをクリックしたときに、私はXCodeのコンソールには何も表示されない

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

    NSLog("Hello") 
} 

私には何が欠けていますか?

+0

[ios wkwebviewはjavascriptの警告ダイアログを表示しました](https://stackoverflow.com/q/26898941/6521116) –

答えて

7

また、WKWebViewでuiDelegateを設定する必要があります。 confirm()prompt()については

import UIKit 
import WebKit 

class ViewController: UIViewController, WKUIDelegate, WKNavigationDelegate { 

    var wkWebView: WKWebView! 

    public override func viewDidLoad() { 
     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)) 
    } 

    func webView(_ webView: WKWebView, 
       runJavaScriptAlertPanelWithMessage message: String, 
       initiatedByFrame frame: 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) -> Void in 
      alert.dismiss(animated: true, completion: nil) 
     } 
     alert.addAction(ok) 
     present(alert, animated: true) 
     completionHandler() 
    } 

    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { 
     wkWebView.evaluateJavaScript("alert('Hello from evaluateJavascript()')", completionHandler: nil) 
    } 
} 

他のデリゲートメソッドを参照してください。ここで

+0

はいこれが設定されました。 jsにWKWebViewを使用させることができますか?私はすべてのネイティブjsアラートを変更しなければならなかった/ダイアログボックスを使用して問題を回避するためにダイアログボックスを確認する必要がありました。 –

+0

はい、うまく動作します。あなたのコントローラーはあなたのUIDelegateですか、別のオブジェクトを持っていましたか?多分、代議員は解任されていたでしょうか? – Onato

+0

このコードでネイティブjsダイアログボックスを開くことはできますか? –

5

スウィフトの様々なjavascriptのアラートの実装のためのサンプルコードです:

それは、ネイティブUIにjavascriptのアラート内の情報の変換についてすべてだし、バックのjavascriptエンジンへのユーザのアクションを送信するためにcompletionHandler()を呼び出し。

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

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

func webView(webView: WKWebView, runJavaScriptTextInputPanelWithPrompt prompt: String, defaultText: String?, initiatedByFrame frame: 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) 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) 

     })) 

     self.presentViewController(alertController, animated: true, completion: nil) 
} 
+0

このコードはipadで動作するようにどのように変更しますか? – applecrusher

+1

私はこの回答の編集として次の行を必要としました:alertController.popoverPresentationController?.sourceView = self.view – applecrusher

+0

@applecrusherコメントをいただきありがとうございます。それは確かにより多くの人々を助けるでしょう:) –

8

少し遅れてしまいましたが、後ほど参考にしたいと思います。私がSwift 3とIOS 10で動作するようにしようとしている間に、@Bon Bonの答えが私を解決策に導いてくれました。 まず、あなたもWKUIDelegateを実装する必要があるので、ViewController宣言に追加します。

self.webView = WKWebView(frame: self.view.frame) 

あなたが割り当てることも必要があります。たとえばので、好きなようにあなたは、WKWebViewオブジェクトをインスタンス化する場合次に

class ViewController: UIViewController, WKUIDelegate { 

インスタンスのuiDelegateプロパティの正しい値:

self.webView?.uiDelegate = self 

そして、最終的にはあなたが@Bonボンで提供されたコードを使用していますが、スウィフト3で必要とされるいくつかの小さな違いがあることに注意することができ、例えばとして、presentViewControllerメソッドの名前はpresent次のようになります。

alertを作っ
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() 
    })) 

    self.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) 
    })) 

    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: 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) 

    })) 

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

confirmationおよびtext inputは、内で正常に動作し、コンパイラの警告なしではXcode 8になります。私は熟練したSwiftプログラマーではないので、コードの正しさに関する有用なコメントは非常に高く評価されます。

+2

素早い3の更新のためにありがとう:) –

+0

あなたのおかげで元のコードのためのボンボン、私は仕事の長い夜を過ごしたでしょう! – wiredolphin

+1

'preferredStyle:.alert'は代わりにpromptに設定する必要があります' preferredStyle:.actionSheet' - この変更なしテキストフィールドはアラートにのみ追加できるというエラーが表示されます – godblessstrawberry

関連する問題