ios - JavaScriptCore 除了 'hello, world' 之外不工作

标签 ios swift cocoa-touch javascriptcore

我目前正在用 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(),对于数组中的每个项目)。

关于ios - JavaScriptCore 除了 'hello, world' 之外不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42562501/

相关文章:

iphone - 适用于雪豹的 Xcode 4.3

iphone - 通过 iPhone 中的方法从 map View 中隐藏图钉/标记

ios - 如何防止调用 UIView.animate

swift - 无法分配给值 : 'self' is immutable

Xcode:有没有办法在界面构建器中更改行距(UI 标签)?

ios - 在某些情况下尝试自动调整大小时,键盘扩展在 iOS 10 中丢失高度

ios - Firebase中非常接近的事件的数据一致性

swift - 尝试删除 firebase 引用时出现问题

swift - 线程 1 : EXC_BAD_INSTRUCTIONS | SWIFT

iphone - 使用 iOS 7 API 的 UICollectionView 交互式布局转换