Script message handler not working
10,901
webkit.messageHandlers
is not an Array. It is a UserMessageHandlersNamespace
.
Try
var message = {"key1":"value1", "key2":"value2", "dictionary": {"name": "foo"}}
webkit.messageHandlers.foo.postMessage(message);
In your message handler.
public func userContentController(userContentController: WKUserContentController, didReceiveScriptMessage message: WKScriptMessage) {
let body = message.body
if let dict = body as? Dictionary<String, AnyObject> {
print(dict)
}
}
Author by
Adrien Cadet
Updated on June 13, 2022Comments
-
Adrien Cadet almost 2 years
I am trying to inject a custom WebKit script message handler. My controller is correctly loaded and the view as well. However, on the JS side (from the Safari console),
window.webkit.messageHandlers
is empty. Any idea why? My app is using iOS 8.1 but even by upgrading to 9.2, it did not work.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") } }
-
Adrien Cadet over 8 yearsHey Onato, thanks for your answer. I know
messageHandlers
is an object. But it has no key at all, and especiallyfoo
is missing. -
Onato over 8 yearsYour swift code worked fine for me. Can you post how you are calling your message handler or checking for the existence of "foo"?
-
Adrien Cadet over 8 yearsArf. Just retested and it works fine. Sorry for the confusion. However, I have a different issue now. I cannot post any custom data. I tried to post a dictionary with 2 strings and another dictionary and the body I received only included a single string. Not a big deal, but do you know anything about that?
-
Adrien Cadet over 8 yearsAwesome! It works fine. I was trying to cast the body as a
NSDictionary
but it did not work as expected.