response-native-image-picker - постоянное хранилище после восстановления - PullRequest
0 голосов
/ 16 января 2019

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

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

Постоянство выбранных изображений (из библиотеки или камеры). Постоянство также при перестройке приложения, что означает, когда я запускаю 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} />

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

Решением было восстановить путь, по которому я хочу отобразить изображение, используя имя файла: <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

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

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

-> Счастливо!

enter image description here enter image description here

Теперь на 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

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

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

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

enter image description here enter image description here

Мой номер

Я прочитал все о временном аспекте возвращаемого 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

но все еще смотрит картинку в 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

Когда изображение фактически находится под:

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",
  • «Reaction-native-image-picker»: «^ 0.28.0»

1 Ответ

0 голосов
/ 17 января 2019

Как 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}`
...