1

我的问题:

  • 我有一个 zip 文件,其中包含我公司设备的固件更新
  • 我希望能够使用 react-native-fs 和下面的代码访问它

.

export function readAssetFile(name) {
  if(Platform.OS === 'ios') {
    return RNFS.readFile(`${RNFS.MainBundlePath}/assets/data/${name}`);
  } else {
    return RNFS.readFileAssets(`raw/${name}`, 'base64');
  }
}

我的项目结构如下:

ProjectDir
  android
  data
    image1.png
    image2.png
    firmwarefile.zip
  ios

android 分支工作,因为我在我的 .gradle 中添加了一个构建步骤,将 firmwarefile.zip 复制到 ProjectDir/android/app/src/main/assets/raw 中。所以我可以调用 readAssetFile('firmwarefile.zip'),它会返回数据。

在 iOS 上,所有图像文件(Image1.png、Image2.png)都包含在 MyProject.app/assets/data/ 中,我无需执行任何操作,但它们旁边的 zip 文件却没有。

查看实际的打包程序代码(来自Metro项目),似乎(基于 Metro/src/defaults.js)打包程序默认不包含 zip 文件,但可以将打包程序配置为包含其他文件类型. 但是我找不到任何关于如何进行配置的文档。

抱歉,这是一个非常简单的问题,但我一直在尝试将这个 zip 包含在我的捆绑包中大约 4 个小时。我正在求助于手动输入console.logs 和error-throws 来跟踪metro 内的东西,以尝试找到我应该在我的配置中发送的位置。

版本:React-native:0.55.3 Metro:0.30.2

4

1 回答 1

1

这是一个 hack,但它完成了它:

  • 将您的 zip 二进制文件转换为 base64 字符串
  • 把它放在一个 .js 文件中,a lamodule.exports = "<your base64 data goes here>"
  • 在需要 zip 文件的文件中,使用import myZipFileAsBase64 from './hacky-base64-file.js';

这是制作 base64 文件的快速脚本:

var fs = require('fs');

function prepareZip(file, outJs) {
  const b64 = fs.readFileSync(file, 'base64');

  fs.writeFileSync(outJs, `module.exports = ${JSON.stringify(b64)};`);
}

prepareZip('./data/myFirmware.zip', './hacky-base64-file.js');
于 2018-06-27T17:51:42.467 回答