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, как вы можете видеть в их исходном коде.