[英]Call native swift function in javascript
對不起,如果這個問題已經被問到,但我能找到的所有答案都是針對復雜的解決方案。
我有一個viewController,它是webView。 我從 WebKit 庫WKWebView
添加到我的視圖中,並打開了簡單的 url。 在我的 ViewController 內部,我有一個名為showAd
的本機函數。 當用戶按下在 javascript 中實現的按鈕時,它會顯示調用showRewardsAd
。 我將斷點設置為 userContentController,但是,它永遠不會到達那里。
func showAd(){
print("invoked")
}
extension WFWebViewController: WKScriptMessageHandler{
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
if message.name == "showRewardsAd"{
self.showRewards()
webView.evaluateJavaScript("test", completionHandler: nil)
}
}
}
我的目標是簡單地允許從 javascript 部分調用這個函數。 據我所知,如果我想快速調用 javascript 函數,我只需要說:
webview.addJavascriptInterface('javascript: function_name();')
但是,就我而言,我想以相反的順序進行。 在 Javascript 代碼中調用 swift 函數。
您需要在 webView 中注入您的用戶腳本,以便您可以在發布時收聽 JavaScript 的消息。
首先,您需要初始化 webView 的配置和首選項,以允許 javaScript:
let config = WKWebViewConfiguration()
let preferences = WKPreferences()
preferences.javaScriptEnabled = true
config.preferences = preferences
現在,您需要注入腳本來監聽來自 webView 的點擊事件:
let userController = WKUserContentController()
let javaScript = "showRewardsAd = function() {\n" + "window.webkit.messageHandlers.adClicked.postMessage(); }"
let script = WKUserScript(source: javaScript, injectionTime: .atDocumentEnd, forMainFrameOnly: false)
userController.addUserScript(script)
userController.add(self, name: "adClicked")
config.userContentController = userController
現在用上面的配置實例化你的 webView:
self.webView = WKWebView(frame: .zero, configuration: config)
現在,您的WKScriptMessageHandler
協議已正確實現:
extension WFWebViewController: WKScriptMessageHandler{
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
if message.name == "showRewardsAd"{
self.showRewards()
print("Ad is being shown.")
}
}
}
我希望這對你有用。 我假設showRewardsAd
是在您訪問的網站上的 JavaScript 中實現的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.