Swift 接收 javascript 消息不起作用

Posted

技术标签:

【中文标题】Swift 接收 javascript 消息不起作用【英文标题】:Swift receiving javascript messages don't work 【发布时间】:2019-03-04 22:09:33 【问题描述】:

我需要 javascript 快速发送消息但不起作用。

Swift 代码:

class FirstViewController: UIViewController, WKUIDelegate, WKScriptMessageHandler 

@IBOutlet weak var webview: WKWebView!

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) 
     print( "Enter here" )

    if message.name == "jsHandler" 
        print( message.body );
    


override func viewDidLoad() 
    super.viewDidLoad()

    let htmlPath = Bundle.main.path(forResource: "index", ofType: "html", inDirectory: "web")
    let url = URL(fileURLWithPath: htmlPath!)
    let request = URLRequest(url: url)

    let user = WKUserContentController()
    user.add(self, name: "jsHandler")
    webview.configuration.userContentController = user

    webview.uiDelegate = self
    webview.navigationDelegate = self
    webview.load(request)

javascript代码:

$(document).on( 'click', '.element', function() 
    window.webkit.messageHandlers.jsHandler.postMessage( "Invoke swift" );
 );

有什么不对还是缺少什​​么?

【问题讨论】:

我找到了解决方案,我会在上面发布答案! 【参考方案1】:

如果您使用 Storyboard,只需在 viewDidLoad 在 webview.load(request) 之前设置

//webview is your @IBOutlet
webview.configuration.userContentController.add(self, name: "yourHandler")
webview.configuration.preferences.javaScriptEnabled = true

【讨论】:

【参考方案2】:

我找到了解决办法。

我不知道这是否是更好的方法,但为我解决了。

Thw wkwebview 在启动时需要配置,因此无法使用图形视图创建。我是通过代码创建的。

//@IBOutlet weak var webview: WKWebView!
var wk: WKWebView!

viewDidLoad 函数内部:

let config = WKWebViewConfiguration()
let user = WKUserContentController()

user.add(self, name: "jsHandler")
config.userContentController = user

wk = WKWebView(frame: .zero, configuration: config)
view.addSubview(wk)

let layoutGuide = view.safeAreaLayoutGuide

wk.translatesAutoresizingMaskIntoConstraints = false
wk.leadingAnchor.constraint(equalTo: layoutGuide.leadingAnchor).isActive = true
wk.trailingAnchor.constraint(equalTo: layoutGuide.trailingAnchor).isActive = true
wk.topAnchor.constraint(equalTo: layoutGuide.topAnchor).isActive = true
wk.bottomAnchor.constraint(equalTo: layoutGuide.bottomAnchor).isActive = true

所以 JavaScript 可以为 Swift 发送消息!

【讨论】:

以上是关于Swift 接收 javascript 消息不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中请求服务器接收 xmpp 消息

使用dwr后,javaweb设置的session超时失效,web.xml和tomcat设置都不起作

无法在 Swift 5 的 Mesibo 聊天集成中接收来自服务器的消息

Swift:解码从 GameKit 发送的消息

Posix消息队列接收/发送/打开不起作用?

我的Android进阶之旅------>Android中ListView中嵌套(ListView)控件时item的点击事件不起作的问题解决方法