Javascript 从java脚本调用swift函数,该脚本使用wk webview返回值

Javascript 从java脚本调用swift函数,该脚本使用wk webview返回值,javascript,ios,swift,wkwebview,wkwebviewconfiguration,Javascript,Ios,Swift,Wkwebview,Wkwebviewconfiguration,我想从java脚本代码调用一个swift函数,该函数将设备id返回到脚本,我已经添加了当前使用的代码。请建议如何从swift函数将值返回到java脚本,提前感谢 代码片段: super.viewDidLoad() { self.webView = WKWebView() let preferences = WKPreferences() preferences.javaScriptEnabled = true let configuration

我想从java脚本代码调用一个swift函数,该函数将
设备id
返回到脚本,我已经添加了当前使用的代码。请建议如何从swift函数将值返回到
java脚本
,提前感谢

代码片段:

     super.viewDidLoad()
    {
    self.webView = WKWebView()
    let preferences = WKPreferences()
    preferences.javaScriptEnabled = true
    let configuration = WKWebViewConfiguration()
    configuration.preferences = preferences
    configuration.userContentController = contentController
    configuration.userContentController.addScriptMessageHandler(self,name: "interOp")
    self.webView = WKWebView(frame: self.view.frame, configuration: configuration)
    print(self.view.frame)
    self.view = self.webView
    webView!.navigationDelegate = self
    let url = NSURL(string:"http://softence.com/devTest/vb_ios.html")
    let req = NSURLRequest(URL:url!)
    self.webView!.loadRequest(req)

    }

// did receivescript message is working fine
func userContentController(userContentController: WKUserContentController, didReceiveScriptMessage message: WKScriptMessage)
{
    let sentData = message.body as! NSDictionary
    print(sentData)
    if sentData["name"] as! String == "DeviceInfo"
    {
        self.DeviceInfo()
    }
}
// i want to return the following device info to javascript
func DeviceInfo() -> String
{
let dict = NSMutableDictionary()
    dict.setValue(UIDevice.currentDevice().model, forKey: "model")
    dict.setValue(UIDevice.currentDevice().name, forKey: "name")
    dict.setValue(UIDevice.currentDevice().systemVersion, forKey: "system_version")
    return String(dict)
}

请尝试查看
WKWebView
上的
evaluateJavaScript(:,completionHandler:)
函数,如前所述

要使用它,您的
DeviceInfo
函数应该定义要执行的完整JavaScript字符串

例如,如果您有这样定义的JavaScript函数:

showDeviceInfo(model, name, system_version) {

}
然后,您的
DeviceInfo
函数可以如下所示:

func deviceInfo() {
    let model = UIDevice.currentDevice().model
    let name = UIDevice.currentDevice().name
    let systemVersion = UIDevice.currentDevice().systemVersion

    let javaScriptString = "showDeviceInfo(\(model), \(name), \(systemVersion));" //string your JavaScript string together from the previous info...and no...it aint pretty :)
    webView.evaluateJavaScript(javaScriptString, completionHandler: nil)
}
您也可以从
DeviceInfo
函数返回
javaScriptString
,然后在
userContentController(userContentController:WKUserContentController,didReceiveScriptMessage:WKScriptMessage)
中调用它,重要的是:

  • 您需要定义要执行的整个JavaScript字符串
  • 您需要调用
    evaluateJavaScript

  • 希望对您有所帮助。

    FYI JavaScript是一个词…;)您可以使用答案,以防您必须以同步方式进行。您好,谢谢您的回复。。。我试着通过evaluateJavaScript方法发送一个简单的字符串,但是没有任何东西被反映出来,并且在网页中显示“未定义”。我也不想发送数据,java脚本必须自动调用swift函数,并从swift函数@pbodskw返回值,您发送的字符串是什么样子的?它必须是有效的JavaScript。关于“JavaScript必须自动调用swift函数”,是的,不是吗?您可以从JavaScript调用Swift函数,该函数调用
    didReceiveScriptMessage
    。这将再次调用
    deviceInfo()
    ,该函数将生成一个JavaScript字符串,该字符串将调用JavaScript函数,并填充正确的数据。还是我误解了你的意思?希望我说的是senseyeah你是对的,我在问我们是否可以直接从java脚本代码调用swift函数,而无需像android中那样向swift代码发送消息。据我所知,你不能,你必须使用
    WKUserContentController
    作为JavaScript代码和本机代码之间的桥梁,正如您在上面的示例中所设置的。一旦调用
    window.webkit.messageHandlers.interOp.postMessage(someDataHere)WKUserContentController
    didReceiveScriptMessage
    检测到的代码>,使您能够准确地确定调用了哪个JavaScript函数。要以另一种方式发送数据,您可以使用我尝试在上面描述的方法查看本文:–-js-bridgeing-on-ios8-using-wkwebview/或者这篇文章,希望它们可以帮助您了解发生了什么:)