在Swift中获取JavaScript执行返回值的方法求助
用Webby在Swift中获取JavaScript返回值的解决方案
嘿,我刚好折腾过Webby这个轻量WebView库的JS调用问题,给你整理下能稳稳拿到返回值的靠谱方案:
核心思路:用Webby自带的evaluateJavaScript异步回调
Webby本身就提供了专门执行JS并接收返回值的API,关键是要注意JS执行是异步的,不能直接同步拿结果,得通过完成回调闭包来处理返回值。
直接拿返回值的示例代码
假设你已经初始化好了Webby的WebView实例(比如叫webbyView),执行JS并获取字符串返回值的完整代码如下:
// 先写你要执行的JS代码,这里模拟返回一个字符串 let targetJS = """ // 比如这是你的业务JS,返回目标字符串 function fetchTargetString() { return "搞定!这是JS返回的字符串"; } fetchTargetString(); """ // 调用Webby的evaluateJavaScript方法 webbyView.evaluateJavaScript(targetJS) { result, error in // 先处理错误情况 if let jsError = error { print("JS执行炸了:\(jsError.localizedDescription)") return } // 把返回结果转成字符串(如果符合预期类型的话) if let returnedString = result as? String { print("成功拿到JS返回值:\(returnedString)") // 这里就可以把returnedString用到你的业务逻辑里啦 } else { print("返回值不是预期的字符串类型,检查下JS返回的是什么") } }
常见踩坑点排查
要是还是拿不到值,大概率是这几个问题:
- JS本身有bug:先把你的JS代码放到浏览器控制台跑一遍,确认它确实能返回你要的字符串,排除JS自身的问题。
- 页面还没加载完就执行JS:一定要等Webby的页面加载完成后再调用JS,比如用它的
onPageLoaded回调:webbyView.onPageLoaded = { [weak self] in guard let self = self else { return } // 在这里执行上面的evaluateJavaScript代码,确保页面已经就绪 } - 返回值类型不匹配:如果JS返回的不是原始字符串(比如是个对象、数组),那转
String肯定失败,得根据实际返回类型调整,比如返回JSON对象的话,就转成[String: Any]再处理。 - Webby版本太老:旧版本可能在JS返回值处理上有bug,建议升级到最新版试试。
进阶方案:用消息桥传递复杂数据
如果你的JS逻辑很复杂,或者需要多次和Swift交互,也可以用WebView的消息桥来传递数据:
- Swift端先注册消息处理器:
webbyView.addMessageHandler(forName: "jsSendToSwift") { message in if let messageContent = message.body as? String { print("通过消息桥收到JS的消息:\(messageContent)") } }
- JS端发送消息:
// 调用WebView的消息桥API发送字符串 window.webkit.messageHandlers.jsSendToSwift.postMessage("这是通过消息桥传的字符串");
这种方式适合更复杂的交互场景,比如JS里的事件触发后主动给Swift传值。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

