【问题标题】:JavaScriptCore doesn't work anything else than 'hello, world'JavaScriptCore 除了 'hello, world' 什么都不能工作
【发布时间】:2017-03-02 17:53:16
【问题描述】:

我目前正在用 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")
}

如何让这件事发挥作用?

【问题讨论】:

    标签: ios swift cocoa-touch javascriptcore


    【解决方案1】:

    查看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(),对于每个项目数组)。

    【讨论】:

      猜你喜欢
      • 2018-01-15
      • 1970-01-01
      • 1970-01-01
      • 2018-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      相关资源
      最近更新 更多