2016-12-06 7 views
1

У меня есть WBWebview, работающий в NSPopover.
Я следил за руководством this, чтобы иметь возможность отправлять данные обратно в мое приложение Swift от JS. К сожалению, userContentController никогда не вызывается в приложении Swift. Вот мой Swift код приложения Посмотреть контроллер: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 обратного вызова webkit.messageHandlers.callbackHandler.postMessage('Does it works?');, но это, кажется, не работает.

С помощью другого теста я обнаружил, что инъекция действительно работает в режиме Swift -> JS (я смог модифицировать CSS видимых элементов HTML через инъекцию кода JQuery), но JS -> Swift мост, похоже, не делает этого. У кого-нибудь есть идея, почему?

Я под OSX 10.11.6, запущен XCode 7.3.6.

Я действительно новичок в программировании Swift и OSX в целом, поэтому не стесняйтесь указывать любой элемент, который мне не хватает. Я произвольно исключаю использование моей страницы JS, так как я не использую ее в этом примере.

Спасибо.

ответ

0

Обнаружил, это было совсем мое плохо. Я забыл переименовать обработчик сообщений, когда добавил свой сценарий в конфигурацию webview.

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