gpt4 book ai didi

ios - 在IOS 10中从Swift WkWebView接口(interface)(类似于Android JS接口(interface))获取Javascript函数返回

转载 作者:搜寻专家 更新时间:2023-11-01 07:12:09 24 4
gpt4 key购买 nike

我目前正在尝试将一个应用程序从 Android 移植到 ios,它通过 webviews 应用了很多逻辑。

在android版本中,我可以有这样的东西

function sendInfo(fileName, dataContent){
Android.saveData(fileName, dataContent);
}

并通过java部分对接口(interface)进行处理

@JavascriptInterface
public void saveData(String fileName, String dataContents) {
//.. do something with the received information
}

尽管我目前遇到问题,但我正在尝试在 ios 中做同样的事情。请注意,我们在 IOS10 中使用 Swift 3。我目前拥有的是:

我已经在 loadView() 中创建了配置和 Controller ,所以当它到达 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,所以拥有不同的 callbackHandlers 几乎是不可能的。我需要的只是拥有类似于 Android 版本的东西。任何指针将不胜感激。

编辑:

我知道我可以将对象传递给消息处理程序,所以我会这样:

webkit.messageHandlers.callbackHandlerFile.postMessage({fileName: file,data: data_txt});

但仍然无法找到一种方法来访问这些数据,因为 message.body 使用字符串

最佳答案

您可以通过创建一个包含数据和您想执行的操作的 JSON 对象来处理这个问题。

示例:

{
“ Action ”:“保存数据”,
“数据”: {
“文件名”:文件名,
“数据内容”:数据内容
}
}

然后像这样将响应作为字典处理:

// message handler delegate method
func userContentController(_ userContentController: WKUserContentController, didReceive message:WKScriptMessage){
guard let body = message.body as? [String: Any] else {
return
}
}

关于ios - 在IOS 10中从Swift WkWebView接口(interface)(类似于Android JS接口(interface))获取Javascript函数返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44247663/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com