React-Native:如何打开本地捆绑的二进制文件

时间:2018-05-23 15:22:21

标签: react-native react-native-fs

我正在编写一个本机应用程序,我希望它使用包含设备固件更新的zip文件进行部署。

在让用户发送更新之前,我需要使用我的代码打开zip并对其内容进行一些验证。

我发现了许多zip处理NPM软件包,所以我需要做的就是加载文件内容,以便将其提供给其中一个。

  • 需要(' ./固件/ fw.zip&#39); < - packager默认不包含.zip
  • 需要(' ./固件/ fw.pdf&#39); < - [gross hack] packager包含pdf,但require()调用的实际结果是一个数字:5。我不知道用这个号码可以做什么来获取文件内容,但我很确定这个require()系统是为加载图像而不是二进制数据而设计的。
  • ReactNativeFs.openFile(' ./固件/ fw.zip&#39); < - 以ENOENT
  • 失败
  • ReactNativeFs.openFile(${ReactNativeFs.MainBundlePath}/firmware/fw.zip); < - MainBundlePath在android上是undefined

这似乎是一个非常基本的问题,所以我确定我错过了某个地方的文档,但是我要在第三个小时内尝试加载此文件的内容没有运气。

我非常确定我可以手动将zip文件放入相应的androidios资源目录中,但这似乎是一条难以维护的道路。 / p>

2 个答案:

答案 0 :(得分:1)

几个月后,我再次遇到了这个问题(显然,我是唯一需要在react-native中打包.zips的人),上面的答案在iOS上无法解决。因此,我将.zip编码为base64,将它们放在.js文件中,然后使用import从那些.js文件中获取数据。实际上,这似乎是一个有点笨拙但又灵活的长期解决方案,而无需弄乱与平台相关的文件位置。

查看我的新问题的完整答案:React-native packager configuration - How to include .zip file in bundle?

答案 1 :(得分:0)

部分解决方案:

修改android / app / build.gradle,然后添加

task copyData(type: Copy) {
    from '../../firmware/fw.zip'
    into 'src/main/assets/raw/firmware'
}
preBuild.dependsOn copyData

这至少可以确保每次构建时都会复制文件,然后ReactNativeFs.readFileAssets('raw/firmware/fw.zip', 'base64')可以使用该文件。我不是完全激动,因为我在加载文件时仍然需要依赖iOS / android的代码,但至少它现在正在加载。

提示:请注意gradle中的语法。 into src/main/assets/myFirmware.zip将创建一个名为myFirmware.zip的目录,并将您的zip文件放在其下面。然后readFileAssets仍然会失败,因为它在您的路径中找到了一个目录,而不是文件。