JavaScriptCore 除了 'hello, world' 以外没有任何作用

JavaScriptCore doesn't work anything else than 'hello, world'

我目前正在 Swift 中编写与比特币相关的应用程序。由于 BIP32/39 没有可用的原生库,我决定使用 JavaScriptCore 的 js 库。

问题是,几乎所有的东西都在 Swift 中输出 undefined,例如:

var pip_buffer = new Uint8Array(strength / 8);

这个有效:

var pip_buffer = "Hello, world"

这是我的 Swift 代码:

var context: JSContext?

private func initJS() {
    context = JSContext()
    if let jsSrcPath = Bundle.main.path(forResource: "script", ofType: "js") {
        do {
            let jsSrcContents = try String(contentsOfFile: jsSrcPath)
            _ = context?.evaluateScript(jsSrcContents)
        } catch let error {
            print(error.localizedDescription)
        }
    }
}

private func getJSVar(name: String) {
    if let vb = context?.objectForKeyedSubscript(name) {
        print("\(vb)")
    }
}

override func viewDidLoad() {
    super.viewDidLoad()
    initJS()
    getJSVar(name: "pip_buffer")
}

如何使这个东西起作用?

查看 JSValue API Doc 我没有看到任何对 Uint8Array 的引用,这可能意味着 JavaScriptCore 无法将 Uint8Array 转换为 "Swift" 值。

您可以在 JS 端使用 Array.from(pip_buffer) 将您的 Uint8Array 转换为常规数字数组,这很有效。

例如

    if let vb = context?.evaluateScript("Array.from(pip_buffer)") {
        print("\(vb)")
    }

转换成一个普通的JS数数组后,也可以用JSValue.toArray()(Swift这边),把它当作数组来获取(也可以用toNumber()toInt32()toUInt32(),对于数组中的每一项)。