2016-01-12 13 views
5

Sto tentando di inserire un gestore di messaggi di script WebKit personalizzato. Il mio controller è stato caricato correttamente e anche la vista. Tuttavia, dal lato JS (dalla console di Safari), window.webkit.messageHandlers è vuoto. Qualche idea del perché? La mia app utilizza iOS 8.1, ma anche aggiornando a 9.2, non ha funzionato.Il gestore dei messaggi di script non funziona

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") 
    } 
} 

risposta

5

webkit.messageHandlers non è una matrice. È un UserMessageHandlersNamespace.

Prova

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

Nel vostro gestore di messaggi.

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, grazie per la risposta. So che messageHandlers è un oggetto. Ma non ha alcuna chiave e in particolare manca "pippo". –

+1

Il tuo codice swift ha funzionato bene per me. Puoi pubblicare come stai chiamando il tuo gestore di messaggi o verificare l'esistenza di "pippo"? – Onato

+0

Arf. Appena ripetuto e funziona bene. Dispiace per la confusione. Tuttavia, ho un problema diverso ora. Non posso pubblicare dati personalizzati. Ho provato a pubblicare un dizionario con 2 stringhe e un altro dizionario e il corpo che ho ricevuto includeva solo una singola stringa. Non è un grosso problema, ma ne sai qualcosa? –

-1

Nel seguente codice javascript, il messaggio è obbligatorio.

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

il seguente codice JavaScript,

webkit.messageHandlers.foo.postMessage();

non ha invocato la func userContentController(userContentController: WKUserContentController, didReceiveScriptMessage message: WKScriptMessage)

Problemi correlati