JavaScriptCore 除了 'hello, world' 啥都不能工作

Posted

技术标签:

【中文标题】JavaScriptCore 除了 \'hello, world\' 啥都不能工作【英文标题】: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")

如何让这件事发挥作用?

【问题讨论】:

【参考方案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(),对于每个项目数组)。

【讨论】:

以上是关于JavaScriptCore 除了 'hello, world' 啥都不能工作的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Browserify & iOS JavaScriptCore

JavaScriptCore学习之JavaScriptCore

PhantomJS如何执行Javascript?

在 JavaScriptCore 中获取默认导出

JavaScriptCore 外部数组

iOS js oc相互调用(JavaScriptCore)