response-native-image-picker - постоянное хранилище после восстановления

Некоторое время я бился головой об экран и просто не могу заставить его работать, несмотря на всю информацию, которую я нашел в git или stackru.

Чего я пытаюсь добиться:

Постоянство выбранных изображений (из библиотеки или камеры). Постоянство также, когда я перестраиваю свое приложение, что означает, когда я запускаю react-native run-ios для iOS или react-native run-android для Android.

Что я реализовал

Вот моя функция, которая вызывается, когда я добавляю изображение.

ImagePicker.showImagePicker({
   storageOptions: {
      path: 'myCustomPath',
      waitUntilSaved: true,
      cameraRoll: true,
      skipBackup : true
   },
   noData: true
}, res => {
   if (res.didCancel) {
      console.log("User cancelled");
   } else if (res.error) {
      console.log("Error", res.error);
   } else {
      console.log("Picker Response:", res);
      // Getting the fileName as for iOS the fileName is incorrect even with waitUntilSaved to true.
      const path = res.uri.split("/");
      const fileName = path[path.length-1]; 
      let uri = "file://" + Platform.select({
         android: RNFS.ExternalStorageDirectoryPath + "/Pictures/",
         ios: RNFS.DocumentDirectoryPath+"/"
         })
         + "myCustomPath/" + fileName

      this.setState({
         pickedImage: {
            uri: uri,
         }
      });
      this.props.onImagePicked({ uri: res.uri }); 
   }
});

И на моей домашней странице я отображаю изображение в <Thumbnail square style={{width:50, height:50}} source={info.item.image} />

---- РЕДАКТИРОВАТЬ СТАРТ ----- ---- РЕШЕНИЕ ----

Решением было восстановить путь, по которому я хочу отобразить изображение, используя fileName: <Thumbnail square style={{width:50, height:50}} source={{uri : RNFS.DocumentDirectoryPath+"/"+info.item.image.fileName}} />

---- РЕДАКТИРОВАТЬ КОНЕЦ -----

Результат

Итак, вот результаты, вы увидите, хорошо работает на Android, но не на iOS. Я выбрал изображение в библиотеке, используя react-native-image-picker,

Android

"Ответ сборщика":

fileName: "image-d53839d1-fa89-4a61-b648-f74dace53f83.jpg"
fileSize: 235728
height: 1440
isVertical: true
originalRotation: 0
path: "/storage/emulated/0/Pictures/myCustomPath/image-d53839d1-fa89-4a61-b648-f74dace53f83.jpg"
type: "image/jpeg"
uri: "file:///storage/emulated/0/Pictures/myCustomPath/image-d53839d1-fa89-4a61-b648-f74dace53f83.jpg"
width: 1080

сохранить "URI" для моего изображения: file:///storage/emulated/0/Pictures/myCustomPath/image-d53839d1-fa89-4a61-b648-f74dace53f83.jpg

Поведение, как показано ниже:

  • скриншот слева после сохранения моего изображения,
  • правый скриншот после перестройки, открыв приложение, я все еще вижу свое изображение!

-> Счастлив!

Теперь на iOS

"Ответ сборщика":

fileName: "IMG_0004.JPG"
fileSize: 470300
height: 1618
isVertical: true
latitude: 64.752895
longitude: -14.538611666666666
origURL: "assets-library://asset/asset.JPG?id=99D53A1F-FEEF-40E1-8BB3-7DD55A43C8B7&ext=JPG"
timestamp: "2012-08-08T21:29:49Z"
type: "image/jpeg"
uri: "file:///Users/[name]/Library/Developer/CoreSimulator/Devices/33076AD2-C989-47E9-A803-3E56CC4B09D6/data/Containers/Data/Application/4756F0A2-9CCC-4F9A-9315-D55434328FD9/Documents/myCustomPath/6A5C27E3-89F7-465F-A855-66749C92D086.jpg"
width: 1080

сохранить "URI" для моего изображения: file:///Users/[name]/Library/Developer/CoreSimulator/Devices/33076AD2-C989-47E9-A803-3E56CC4B09D6/data/Containers/Data/Application/4756F0A2-9CCC-4F9A-9315-D55434328FD9/Documents/myCustomPath/6A5C27E3-89F7-465F-A855-66749C92D086.jpg

Поведение, как показано ниже:

  • скриншот слева после сохранения моего изображения,
  • правый скриншот после перестройки, открыв приложение, я все еще вижу свое изображение!

-> НЕ СЧАСТЛИВЫ!

Моя проблема

Я прочитал все о временном аспекте возвращенного URI и посмотреть, что react-native-image-picker говорит об этом:

На iOS не думайте, что возвращаемое абсолютное значение URI сохранится.

Я также нашел эту ветку, у которой была похожая проблема, но ни одна не работала:

  • RNFS.DocumentDirectoryPath после перестройки в пути был другой UUID, поэтому файл не был найден, так как он был сохранен с предыдущим UUID
  • Я попытался сохранить для iOS URI, так как '~/Documents/myCustomPath/myfilename.jpg' имел такое же поведение. Отображается при добавлении, пусто после перестроения.

У меня было до перестройки:

Путь к каталогу документов: file:///Users/[user]/Library/Developer/CoreSimulator/Devices/33076AD2-C989-47E9-A803-3E56CC4B09D6/data/Containers/Data/Application/466CAF1A-AF8D-423C-9BF6-F0A242AF8038/Documents/

и моя сохраненная фотография uri:

file:///Users/[user]/Library/Developer/CoreSimulator/Devices/33076AD2-C989-47E9-A803-3E56CC4B09D6/data/Containers/Data/Application/466CAF1A-AF8D-423C-9BF6-F0A242AF8038/Documents/myCustomPath/20969988-633B-46BD-8558-E39C3ADD6D12.jpg

но после перестройки UUID приложения изменился на BEE128C8-5FCF-483C-A829-8F7A0BB4E966 делая теперь мой каталог документов, чтобы быть

file:///Users/[user]/Library/Developer/CoreSimulator/Devices/33076AD2-C989-47E9-A803-3E56CC4B09D6/data/Containers/Bundle/Application/BEE128C8-5FCF-483C-A829-8F7A0BB4E966/Documents

но все равно смотрю картинку в ури

file:///Users/[user]/Library/Developer/CoreSimulator/Devices/33076AD2-C989-47E9-A803-3E56CC4B09D6/data/Containers/Data/Application/466CAF1A-AF8D-423C-9BF6-F0A242AF8038/Documents/myCustomPath/20969988-633B-46BD-8558-E39C3ADD6D12.jpg

Когда изображение на самом деле сейчас находится под:

file:///Users/[user]/Library/Developer/CoreSimulator/Devices/33076AD2-C989-47E9-A803-3E56CC4B09D6/data/Containers/Data/Application/BEE128C8-5FCF-483C-A829-8F7A0BB4E966/Documents/myCustomPath/20969988-633B-46BD-8558-E39C3ADD6D12.jpg

Так, как я могу справиться с этим изменением UUID приложения после перестроения, поскольку пути являются динамическими на iOS.

Версии, которые я использую:

  • "реактивный-нативный": "0,57,8",
  • "response-native-fs": "^ 2.13.2",
  • "response-native-image-picker": "^0.28.0"

1 ответ

Решение

Как react-native-image-picker состояния

На iOS не думайте, что возвращаемое абсолютное значение URI сохранится.

Это означает, что если вы сохраните абсолютный URI в файл, а затем выполните react-native run-ios GUID приложения изменится, и этот абсолютный URI больше не будет существовать или работать. Тем не менее, и это важно, изображение будет в папке, в которой вы его сохранили, так как оно копируется.

Единственное решение этой проблемы - сохранить каталог и имя файла файла и восстановить URI, когда вы захотите его использовать.

Так что это означает, что вы бы сохранить в состоянии

this.setState({ image: '/myCustomPath/image.jpg' });

Затем, когда вы используете его, вы перестроите путь следующим образом.

let pathToFile = `${RNFS.DocumentDirectoryPath}${this.state.image}`

Вы можете просто решить эту проблему (не полагаясь на response-native-fs), заменив путь перед "/Documents/..." тильдой "~".

let pathToFile = "file:///var/mobile/Containers/Data/Application/9793A9C3-C666-4A0E-B630-C94F02E32BE4/Documents/images/72706B9A-12DF-4196-A3BE-6F17C61CAD06.jpg"
if (Platform.OS === 'ios') {
    pathToFile = '~' + pathToFile.substring(pathToFile.indexOf('/Documents'));
}

Это поддерживается React Native, как вы можете видеть в их исходном коде.

Другие вопросы по тегам