3

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

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

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

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

这似乎是一个非常基本的问题,所以我确定我在某处错过了一段文档,但我正在进入第三个小时试图加载这个文件的内容,但没有运气。

我很确定我可以手动将 zip 文件放入适当的android资源ios目录,但这似乎是一条难以维护的道路。

4

2 回答 2

2

几个月后我再次遇到了这个问题(我显然是唯一需要在 react-native 中打包 .zips 的人),并且上述答案不适用于 iOS。所以我将 .zip 编码为 base64,将它们放入 .js 文件中,然后用于import从这些 .js 文件中获取数据。这实际上似乎是一个有点老套但也很灵活的长期解决方案,而不必弄乱与平台相关的文件位置。

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

于 2018-06-27T18:10:17.970 回答
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 仍然会失败,因为它在您的路径中查找目录,而不是文件。

于 2018-05-23T16:01:14.277 回答