Javascript 从java脚本调用swift函数,该脚本使用wk webview返回值
我想从java脚本代码调用一个swift函数,该函数将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
设备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)
中调用它,重要的是:
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/或者这篇文章,希望它们可以帮助您了解发生了什么:)