2016-01-12 12 views
5

Ich versuche, einen benutzerdefinierten WebKit-Skript-Meldungshandler zu injizieren. Mein Controller ist korrekt geladen und auch die Ansicht. Auf der JS-Seite (von der Safari-Konsole aus) ist window.webkit.messageHandlers jedoch leer. Irgendeine Idee warum? Meine App verwendet iOS 8.1, aber selbst beim Aktualisieren auf 9.2 hat es nicht funktioniert.Script-Meldungshandler funktioniert nicht

import Foundation 
import UIKit 
import WebKit 

public class FooController: UIViewController, WKScriptMessageHandler { 
    private var wkWebView: WKWebView? 

    public override func viewDidLoad() { 
     super.viewDidLoad() 

     let o = WKUserContentController() 
     o.addScriptMessageHandler(self, name: "foo") 
     let config = WKWebViewConfiguration() 
     config.userContentController = o 

     self.wkWebView = WKWebView(frame: self.view.bounds, configuration: config) 
     self.view.addSubview(self.wkWebView!) 

     self.wkWebView!.loadRequest(NSURLRequest(URL: NSBundle.mainBundle().URLForResource("foo", withExtension: "html")!)) 
    } 

    public func userContentController(userContentController: WKUserContentController, didReceiveScriptMessage message: WKScriptMessage) { 
     print("foo") 
    } 
} 

Antwort

5

webkit.messageHandlers ist kein Array. Es ist ein UserMessageHandlersNamespace.

Versuchen

var message = {"key1":"value1", "key2":"value2", "dictionary": {"name": "foo"}} 
webkit.messageHandlers.foo.postMessage(message); 

In Ihrem Nachrichten-Handler.

public func userContentController(userContentController: WKUserContentController, didReceiveScriptMessage message: WKScriptMessage) { 
    let body = message.body 
    if let dict = body as? Dictionary<String, AnyObject> { 
     print(dict) 
    } 
} 
+0

Hey onato dank nicht aufrufen. Ich weiß, dass 'messageHandlers' ein Objekt ist. Aber es hat überhaupt keinen Schlüssel und vor allem fehlt 'foo'. –

+1

Ihr schneller Code funktionierte gut für mich. Können Sie posten, wie Sie Ihren Message-Handler aufrufen oder nach dem Vorhandensein von "foo" suchen? – Onato

+0

Arf. Nur noch einmal getestet und es funktioniert gut. Entschuldigung für die Verwirrung. Allerdings habe ich jetzt ein anderes Problem. Ich kann keine benutzerdefinierten Daten posten. Ich habe versucht, ein Wörterbuch mit 2 Zeichenfolgen und einem anderen Wörterbuch zu veröffentlichen, und der Körper, den ich erhielt, enthielt nur eine einzelne Zeichenfolge. Keine große Sache, aber wissen Sie etwas darüber? –

-1

Im folgenden JavaScript-Code ist eine Nachricht obligatorisch.

var message = {"key1":"value1", "key2":"value2", "dictionary": {"name": "foo"}} 
webkit.messageHandlers.foo.postMessage(message); 

den folgenden JavaScript-Code,

webkit.messageHandlers.foo.postMessage();

hat die für Ihre Antwort func userContentController(userContentController: WKUserContentController, didReceiveScriptMessage message: WKScriptMessage)