Обработчик сообщений скрипта не работает

Я пытаюсь внедрить пользовательский обработчик сообщений скрипта WebKit. Мой контроллер правильно загружен и вид тоже. Однако на стороне JS (из консоли Safari) window.webkit.messageHandlers пустой. Есть идеи почему? Мое приложение использует iOS 8.1, но даже после обновления до 9.2 оно не сработало.

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

2 ответа

Решение

webkit.messageHandlers это не массив Это UserMessageHandlersNamespace,

Пытаться

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

В вашем обработчике сообщений.

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

В приведенном ниже коде JavaScript сообщение является обязательным.

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

Следующий код JavaScript без параметра сообщения,

webkit.messageHandlers.foo.postMessage();

не ссылаться на func userContentController(userContentController: WKUserContentController, didReceiveScriptMessage message: WKScriptMessage) как и ожидалось

Другие вопросы по тегам