2016-01-12 74 views
5

カスタム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") 
    } 
} 

答えて

5

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) 
    } 
} 
+0

オナトねえ、おかげで起動しませんでした。私は 'messageHandlers'がオブジェクトであることを知っています。しかし、キーが全くなく、特に 'foo'が欠けています。 –

+1

あなたの素早いコードは私のためにうまくいきました。メッセージハンドラを呼び出す方法や "foo"の存在を確認する方法を投稿できますか? – Onato

+0

Arf。ただ再テストされ、正常に動作します。混乱させて申し訳ありません。 しかし、今は別の問題があります。カスタムデータを投稿することはできません。私は2つの文字列と別の辞書を持つ辞書を投稿しようとしました、そして、私が受け取ったボディは、ただ1つの文字列を含んでいました。大したことではありませんが、それについて何か知っていますか? –

-1

以下の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)