8

我正在尝试注入自定义 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")
    }
}
4

2 回答 2

10

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)
    }
}
于 2016-01-13T05:43:19.753 回答
-2

在下面的 javascript 代码中,消息是强制性的。

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

以下没有 message 参数的 javascript 代码,

webkit.messageHandlers.foo.postMessage();

没有func userContentController(userContentController: WKUserContentController, didReceiveScriptMessage message: WKScriptMessage)按预期调用

于 2017-07-12T09:35:19.550 回答