2016-12-06 8 views
1

WBWebviewNSPopoverになっています。
JSからSwiftアプリケーションにデータを送り返すために、私はthisガイドに従ってきました。 残念ながら、はSwiftアプリケーションでは呼び出されません。 は、ここに私のスウィフトのアプリのビューコントローラのコードです:私は直接スウィフトコールバックwebkit.messageHandlers.callbackHandler.postMessage('Does it works?');への呼び出しを注入しようとしているuserContentControllerはJS注入から返されることはありません

class GSViewController: NSViewController, WKScriptMessageHandler, WKNavigationDelegate { 

    var webView: WKWebView? 

    var webConfig:WKWebViewConfiguration { 
     get { 

      // Create WKWebViewConfiguration instance 
      let webCfg:WKWebViewConfiguration = WKWebViewConfiguration() 

      // Setup WKUserContentController instance for injecting user script 
      let userController:WKUserContentController = WKUserContentController() 

      // Add a script message handler for receiving "buttonClicked" event notifications posted from the JS document using window.webkit.messageHandlers.buttonClicked.postMessage script message 
      userController.addScriptMessageHandler(self, name: "buttonClicked") 

      // Get script that's to be injected into the document 
      let js:String = buttonClickEventTriggeredScriptToAddToDocument() 

      // Specify when and where and what user script needs to be injected into the web document 
      let userScript:WKUserScript = WKUserScript(source: js, injectionTime: WKUserScriptInjectionTime.AtDocumentEnd, forMainFrameOnly: false) 

      // Add the user script to the WKUserContentController instance 
      userController.addUserScript(userScript) 

      // Configure the WKWebViewConfiguration instance with the WKUserContentController 
      webCfg.userContentController = userController; 

      return webCfg; 
     } 
    } 

    override func loadView() { 
     super.loadView() 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.webView = WKWebView(frame: self.view.frame, configuration: webConfig) 
     self.webView!.navigationDelegate = self 
     self.view = webView! 

     let username = NSUserName() 
     let url = NSURL(string:"someUrl") 
     let req = NSURLRequest(URL:url!) 
     self.webView!.loadRequest(req) 
     self.view.frame = CGRectMake(0, 0, 440, 600) 
    } 

    func buttonClickEventTriggeredScriptToAddToDocument() ->String{ 
     let script:String = "webkit.messageHandlers.callbackHandler.postMessage('Does it works?');" 
     return script; 

    } 

    // WKNavigationDelegate 
    func webView(webView: WKWebView, didFinishNavigation navigation: WKNavigation!) { 
     NSLog("%s", #function) 
    } 

    func webView(webView: WKWebView, didFailNavigation navigation: WKNavigation!, withError error: NSError) { 
     NSLog("%s. With Error %@", #function, error) 
     showAlertWithMessage("Failed to load file with error \(error.localizedDescription)!") 
    } 

    func userContentController(userContentController: WKUserContentController, didReceiveScriptMessage message: WKScriptMessage) { 
     print("called") 
     if(message.name == "callbackHandler") { 
      print("It does ! \(message.body)") 
     } 
    } 

    // Helper 
    func showAlertWithMessage(message:String) { 
     let myPopup:NSAlert = NSAlert() 
     myPopup.messageText = message 
     myPopup.alertStyle = NSAlertStyle.WarningAlertStyle 
     myPopup.addButtonWithTitle("OK") 
     myPopup.runModal() 
    } 

} 

、動作しないようです。

異なるテストでは、Swift - > JSの方法で注入が実際に動作することを発見しました(JQueryコードを注入して表示可能なHTML要素のCSSを修正できました)が、JS - > Swift橋はちょうどそれを作るように見えません。 誰もがなぜアイデアを持っていますか?

私はXCode 7.3.6を実行しているOSX 10.11.6です。

私はSwiftとOSXのプログラミングには一般的に新しく、欠けている要素を指摘するのをためらっています。私はこの例ではJSのページを使用していないので、自発的にJSのページを省略しています。

ありがとうございました。

答えて

0

それは完全に私の悪かった。 スクリプトをwebview設定に追加したときにメッセージハンドラの名前を変更するのを忘れました。

userController.addScriptMessageHandler(self, name: "callbackHandler") // was originally "ButtonClicked" 
関連する問題