Javascript 从 Swift WkWebView 接口(类似于 Android JS 接口)获取 Javascript 函数 return in IOS 10
Getting Javascript function return from Swift WkWebView interface(similar to Android JS interfaces) in IOS 10
我目前正在尝试将一个应用程序从 Android 移植到 ios,它通过 webviews 应用了很多逻辑。
在android版本中,我可以有诸如
之类的东西
function sendInfo(fileName, dataContent){
Android.saveData(fileName, dataContent);
}
并通过java部分对接口进行处理
@JavascriptInterface
public void saveData(String fileName, String dataContents) {
//.. do something with the received information
}
我正在尝试在 ios 中做同样的事情,尽管我目前遇到了问题。请注意,我们在 IOS10 中使用 Swift 3。我目前拥有的是:
我已经在 loadView() 中创建了配置和控制器,所以当它到达 viewDidLoad() 时,所有内容都会显示在应用程序上。
override func loadView(){
super.loadView()
let contentController = WKUserContentController()
contentController.add(self as WKScriptMessageHandler, name: "callbackHandlerFile")
// configuration
let config = WKWebViewConfiguration()
config.userContentController = contentController
self.webView = WKWebView(frame: self.view.frame, configuration: config)
self.view = self.webView
}
override func viewDidLoad() {
super.viewDidLoad()
let url = NSURL(fileURLWithPath: Bundle.main.path(forResource: "html/_wv", ofType: "html")!)
let req = URLRequest(url: url as URL)
self.webView!.load(req)
}
我的问题是因为我看到信息从 Javascript 发送到 swift 的方式是这样的:
function sendInfo(fileName, dataContent){
webkit.messageHandlers.callbackHandlerFile.postMessage(fileName);
webkit.messageHandlers.callbackHandlerFile.postMessage(dataContent);
}
然后我们将它们检索为:
// message handler delegate method
func userContentController(_ userContentController: WKUserContentController, didReceive message:WKScriptMessage){
if(message.name == "callbackHandlerFile") {
print(message.body)
}
}
print 语句将一个接一个地打印出两条消息,这意味着它将打印 fileName 的内容,然后打印 dataContent 的内容,因为所有数据都在同一个实例上混合在一起。
如何获得与android对应物相同的效果?我需要将这两个部分放在同一个地方,因为我需要创建一些文件 i/o,因此具有不同的回调处理程序几乎超出了 question.All 我需要的是类似于 Android 版本。任何指针将不胜感激。
编辑:
我知道我可以将对象传递给消息处理程序,所以我会这样:
webkit.messageHandlers.callbackHandlerFile.postMessage({fileName: file,data: data_txt});
但是仍然无法找到一种方法来访问这些数据,因为 message.body
使用字符串
,所以编译器不会给我错误
您可以通过创建一个包含数据和您想执行的操作的 JSON 对象来处理这个问题。
示例:
{
"action" : "saveData",
"data": {
"fileName": fileName,
"dataContent" : dataContent
}
}
然后像这样将响应作为字典处理:
// message handler delegate method
func userContentController(_ userContentController: WKUserContentController, didReceive message:WKScriptMessage){
guard let body = message.body as? [String: Any] else {
return
}
}
我目前正在尝试将一个应用程序从 Android 移植到 ios,它通过 webviews 应用了很多逻辑。
在android版本中,我可以有诸如
之类的东西function sendInfo(fileName, dataContent){
Android.saveData(fileName, dataContent);
}
并通过java部分对接口进行处理
@JavascriptInterface
public void saveData(String fileName, String dataContents) {
//.. do something with the received information
}
我正在尝试在 ios 中做同样的事情,尽管我目前遇到了问题。请注意,我们在 IOS10 中使用 Swift 3。我目前拥有的是:
我已经在 loadView() 中创建了配置和控制器,所以当它到达 viewDidLoad() 时,所有内容都会显示在应用程序上。
override func loadView(){
super.loadView()
let contentController = WKUserContentController()
contentController.add(self as WKScriptMessageHandler, name: "callbackHandlerFile")
// configuration
let config = WKWebViewConfiguration()
config.userContentController = contentController
self.webView = WKWebView(frame: self.view.frame, configuration: config)
self.view = self.webView
}
override func viewDidLoad() {
super.viewDidLoad()
let url = NSURL(fileURLWithPath: Bundle.main.path(forResource: "html/_wv", ofType: "html")!)
let req = URLRequest(url: url as URL)
self.webView!.load(req)
}
我的问题是因为我看到信息从 Javascript 发送到 swift 的方式是这样的:
function sendInfo(fileName, dataContent){
webkit.messageHandlers.callbackHandlerFile.postMessage(fileName);
webkit.messageHandlers.callbackHandlerFile.postMessage(dataContent);
}
然后我们将它们检索为:
// message handler delegate method
func userContentController(_ userContentController: WKUserContentController, didReceive message:WKScriptMessage){
if(message.name == "callbackHandlerFile") {
print(message.body)
}
}
print 语句将一个接一个地打印出两条消息,这意味着它将打印 fileName 的内容,然后打印 dataContent 的内容,因为所有数据都在同一个实例上混合在一起。
如何获得与android对应物相同的效果?我需要将这两个部分放在同一个地方,因为我需要创建一些文件 i/o,因此具有不同的回调处理程序几乎超出了 question.All 我需要的是类似于 Android 版本。任何指针将不胜感激。
编辑:
我知道我可以将对象传递给消息处理程序,所以我会这样:
webkit.messageHandlers.callbackHandlerFile.postMessage({fileName: file,data: data_txt});
但是仍然无法找到一种方法来访问这些数据,因为 message.body
使用字符串
您可以通过创建一个包含数据和您想执行的操作的 JSON 对象来处理这个问题。
示例:
{
"action" : "saveData",
"data": {
"fileName": fileName,
"dataContent" : dataContent
}
}
然后像这样将响应作为字典处理:
// message handler delegate method
func userContentController(_ userContentController: WKUserContentController, didReceive message:WKScriptMessage){
guard let body = message.body as? [String: Any] else {
return
}
}