react-native-fs
будет обращаться только к файлам из хранилища устройства.Так что эта проблема ставит в тупик.Эти файлы связаны во время сборки, так как мы можем получить к ним доступ в процессе разработки или производства?
Структура моего проекта
├── android
├── app
│ └── assets
│ └── images
└── ios
Я храню свои изображения внутри ./app/assets/images/
Разработка
В Разработка или отладка файлы передаются на устройство через Metro-пакет, поэтому они фактически не сохраняются на устройстве.Таким образом, доступ к ним из хранилища устройств будет невозможен.Вы должны были бы предоставить какую-то смоделированную функциональность для разработки.Можно использовать __DEV__
, чтобы разрешить запуск различных функций в зависимости от среды https://facebook.github.io/react-native/docs/javascript-environment
if (__DEV__) {
// do something in development
} else {
// do something in production
}
Производство
Из некоторых исследований кажется, что возможно получить доступ кфайлы в производстве.
iOS
Я обнаружил, что файлы находятся в папке с именем assets
, которая находится в MainBundlePath
.
Поэтому, если вы хотите получить доступ к следующему файлу в моем локальном каталоге ./app/assets/images/image.png
, вам потребуется следующий путь к файлу: RNFS.MainBundlePath + /assets/app/assets/images/image.png
для доступа к нему на устройстве.
Вы можете проверить путь к файлу, посмотрев на Packaging.log
, сгенерированный вашим ipa
.
Android
В Android нет папки с именем MainBundlePath
, которая находится только на iOS
.Я провел некоторое время, исследуя и просматривая различные папки на устройстве, но не смог получить доступ к изображениям, которые в комплекте.Казалось бы, они не доступны так, как мы надеемся, используя react-native-fs
.
Возможные решения
rn-fetch-blob
rn-fetch-blob
имеет функциональность для обоих ios
и Android
для чтения из каталога ресурсов
Чтобы получить доступ к файлам для iOS
, вы должны сделать что-то вроде этого:
RNFetchBlob.fs.stat(fs.dirs.MainBundleDir + '/whatever/files/you/added.mp3').then( stats => {...});
И для Android
вы бы сделаличто-то вроде этого:
RNFetchBlob.fs.stat(fs.asset('/whatever/files/you/added.mp3').then( stats => {...});
Это предупреждает о сжатии ресурсов Gradle.
Gradle по умолчанию сжимает связанные активы.Для взаимодействия с файлами ресурсов с этим модулем сжатие должно быть отключено.См. Как получить доступ к файлам из ресурсов для получения более подробной информации.
Это может объяснить, почему я не смог найти какие-либо активы в Android при поиске с помощью react-native-fs
Подробнее об использовании rn-fetch-blob
и его файловой системе можно прочитать здесь https://github.com/joltup/rn-fetch-blob#user-content-file-system
Хранение файлов в собственных проектах
Вместо того, чтобы полагаться на упаковщик для упаковки изображений для васи положить их на устройство.Вы можете хранить их копии уже в проектах iOS
и Android
.Это дает преимущество в том, что изображения будут доступны в процессе разработки, однако вы сохраняете изображения несколько раз, и это может привести к увеличению размеров приложения.
Хранение изображений в формате base64
Вы можете сохранить изображения в виде строк base64 в файлах json, а затем запрашивать их в своем приложении.Это будет означать, что они будут уже в base64 (поэтому приложение не должно выполнять никаких преобразований), но вы снова увеличите размер своего приложения.Если это только небольшое количество изображений, это может быть самый простой вариант.