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