2016-12-06 1 views
1

J'ai un WBWebview qui court dans un NSPopover. J'ai suivi le guide this afin de pouvoir renvoyer des données à mon application Swift de JS. Malheureusement, userContentController n'est jamais appelée dans l'application Swift. Voici mon application Swift Voir code du contrôleur:userContentController n'a jamais été rappelé depuis l'injection 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() 
    } 

} 

Je suis en train d'injecter directement l'appel à rappel Swift webkit.messageHandlers.callbackHandler.postMessage('Does it works?');, mais il semble ne pas fonctionner. Avec un test différent, j'ai découvert que l'injection fonctionne réellement de la manière Swift -> JS (j'ai pu modifier le CSS des éléments HTML visibles via l'injection du code JQuery), mais le JS -> Swift le pont ne semble pas le faire. Est-ce que quelqu'un a une idée pourquoi? Je suis sous OSX 10.11.6, exécutant XCode 7.3.6.

Je suis vraiment nouveau dans la programmation Swift et OSX en général, donc je n'hésite pas à signaler tout élément qui me manque. Je suis volontaire en omettant le JS que ma page utilise, puisque je n'en utilise aucun dans l'exemple.

Merci.

Répondre

0

Trouvé, était totalement mon mauvais. J'ai oublié de renommer le gestionnaire de messages lorsque j'ai ajouté mon script à la configuration de la WebView.

userController.addScriptMessageHandler(self, name: "callbackHandler") // was originally "ButtonClicked"