如何解决使用 WKWebView 处理 JavaScript 函数返回值的最佳方法
我目前正在与同行一起开发一个项目,该项目将采用您的 TypeScript 代码并在原生 Swift 中为其生成类型安全的函数。即
index.ts
function setLabel(text: string) { ... }
async function addNumbers(a: number,b: number) { ... }
生成 → TypeScript.swift
enum TypeScript {
case setLabel(text: String)
case addNumbers(a: Double,b: Double)
var js: String {
switch self {
case .setLabel(let text): return "setLabel(\"\(text)\");"
case .addNumbers(let a,let b): return "addNumbers(\(a),\(b));"
}
}
}
这样,在一些 WKWebView 扩展的帮助下,可以加载 TypeScript 文件并调用它们各自的函数:
ViewController.swift
webView.load(.index) // evaluate index.js in WKWebView
webView.ts(.setLabel("Hello,World!")) // > setLabel("Hello,world!");
webView.ts(.addNumbers(5,10)) // > addNumbers(5,10);
到目前为止一切顺利;但是,我不确定处理这些回调返回值的最佳方法。假设我想评估代码:webView.ts(.addNumbers(5,10))
并在 WebView 返回 15
后在原生 Swift 应用程序中执行一些操作。
我正在考虑使用Combine来观察通过控制台发送的返回值的变化状态。一旦状态发生变化,它就会触发一个通知,该通知将触发一些 Swift 函数。
到目前为止,我一直在使用带有功能键标志的 WKScriptMessageHandler
来捕获使用 window.webKit.messageHandlers
发送的特定语句。
index.ts → 将结果作为字符串发送到 Swift 控制台
const addNumbersResult = addNumbers(a,b)
const msg = '[WKTS] addNumbers: ${addNumbersResult}'
window.webkit.messageHandlers.eventListeners.postMessage(msg)
ViewController.swift → 捕获 String,匹配 function-key,并使用回调返回值触发对应的 Swift 函数
func userContentController(...) {
if message.contains("[WKTS]") {
// Message is a return value from some TS function
if message.contains("addNumbers") {
result = extractResult(message)
runSomeFunction(with: result)
}
}
}
此外,我如何构建生成的代码/文件以便更轻松地进行功能键匹配?我一直在尝试不同的语法类型,但尚未确定一种。同样,我还没有决定如何管理多个 TypeScript 文件(嵌套枚举?)。
到目前为止,我很喜欢枚举实现,因为它允许使用 Swifty 语法,例如:webView.ts(.myFunction)
和 webView.ts(index.myFunction(input))
(用于多 TS 文件)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。