如何通过 JavascriptCore 注入和使用这个 javascript 库 (web3)

Posted

技术标签:

【中文标题】如何通过 JavascriptCore 注入和使用这个 javascript 库 (web3)【英文标题】:How can I inject and use this javascript library (web3) with JavascriptCore 【发布时间】:2018-04-14 06:13:27 【问题描述】:

我一直在尝试在 Swift 中将 web3 库与 javascriptCore 一起使用。通过运行创建一个 web3 实例

var web3 = new Web3(new Web3.providers.HttpProvider("[the provider im using]"))

这是我试图在 Swift 中执行此操作的代码:

if let url = Bundle.main.url(forResource: "web3", withExtension: "js")
     let lib = try! String(contentsOfFile: url.path)
     let jsvirtualmachine = JSVirtualMachine()
     let context = JSContext(virtualMachine: jsvirtualmachine)
     context.evaluateScript(lib)

     let web3 = context.evaluateScript("var web3 = new Web3(new Web3.providers.HttpProvider('[myprovider]')")
     let fn = context.objectForKeyedSubscript("web3")
     let fn1 = fn?.construct(withArguments: [])
     let latestBlockNumber = context.evaluateScript("web3.eth.blockNumber")
     print(latestBlockNumber)

我已经尝试打印出 latestBlockNumber、web3、fn 和 fn1,它们都返回 undefined

有什么想法吗?

【问题讨论】:

这次尝试成功了吗? 【参考方案1】:

web3.js 库依赖于bignumber.js 和crypto-js.js(请参阅dependencies here)。您需要将这两个 JS 库添加到包中并以类似的方式加载它们,例如

do 
    let bigNumberJS = try String(contentsOf: Bundle.main.url(forResource: "bignumber.min", withExtension: "js")!, encoding: .utf8)
    let cryptoJS = try String(contentsOf: Bundle.main.url(forResource: "crypto-js", withExtension: "js")!, encoding: .utf8)
    let web3JS = try String(contentsOf: Bundle.main.url(forResource: "web3-light.min", withExtension: "js")!, encoding: .utf8)
    context.evaluateScript(bigNumberJS)
    context.evaluateScript(cryptoJS)
    context.evaluateScript(web3JS)
    context.evaluateScript("var Web3 = require('web3'); var web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545'));")
    if let version = context.evaluateScript("web3.version.api") 
        print("Web3 version is \(version)")
    

catch 
    print("An error occurred")

【讨论】:

嗨,与 bignumber 不同,crypto-js 有多个文件。如何处理? 他们的每个版本都包含一个crypto-js.js,其中包含一个文件中的所有内容。尝试下载最新版本的 zip 文件。 github.com/brix/crypto-js/releases/tag/3.1.9-1

以上是关于如何通过 JavascriptCore 注入和使用这个 javascript 库 (web3)的主要内容,如果未能解决你的问题,请参考以下文章

一个人如何在JavaScriptCore中使用摩卡咖啡和柴? [关闭]

JavaScriptCore 可移植性

如何使用 JavaScriptCore 将错误记录到 XCode?

如何使用 JavaScriptCore 从 Swift 中的 javascript SDK 调用异步 javascript 函数

如何在 JavaScriptCore 中将新的原生类添加到 WebWorker 的上下文中?

如何在 Swift 的 JavaScriptCore 中导入模块?