簡體   English   中英

在javascript中調用本機swift函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM