iOS与Expo 50中FileSystem copyAsync无法正常工作求助
解决Expo 50 iOS上FileSystem.copyAsync复制ph:// URI文件失败的问题
问题原因
ph://格式的URI是iOS Photos框架的资源标识符,并非直接可访问的文件路径。Expo的FileSystem无法直接读取这类URI,因为它们指向系统相册中的资源,而非应用沙盒内的可访问文件,因此调用copyAsync时会提示"File '' is not readable"错误。
解决方案
方案一:使用expo-image-picker的缓存复制选项(若通过图片选择器获取资源)
如果图片是通过expo-image-picker获取的,只需在调用选择器时添加copyToCacheDirectory: true参数,它会自动将选中的照片复制到应用缓存目录,并返回file://开头的可访问URI:
import * as ImagePicker from 'expo-image-picker'; import * as FileSystem from 'expo-file-system'; // 请求相册权限 const permissionResult = await ImagePicker.requestMediaLibraryPermissionsAsync(); if (!permissionResult.granted) { alert('需要相册访问权限'); return; } // 启动图片选择器并开启缓存复制 const result = await ImagePicker.launchImageLibraryAsync({ mediaTypes: ImagePicker.MediaTypeOptions.Images, allowsEditing: false, copyToCacheDirectory: true, // 关键参数 }); if (!result.canceled) { const uri = result.assets[0].uri; const uriParts = uri.split("."); const fileType = uriParts[uriParts.length - 1]; const time = new Date().getTime(); const newUri = `${FileSystem.documentDirectory}/${time}.${fileType}`; // 执行复制操作 await FileSystem.copyAsync({ from: uri, to: newUri, }); }
方案二:使用expo-media-library获取可访问的本地路径(若已有ph:// URI)
如果已经持有ph://格式的URI,可以通过expo-media-library获取资源的本地可访问路径:
import * as MediaLibrary from 'expo-media-library'; import * as FileSystem from 'expo-file-system'; // 请求相册权限 const permissionResult = await MediaLibrary.requestPermissionsAsync(); if (!permissionResult.granted) { alert('需要相册访问权限'); return; } // 获取资源信息,拿到本地可访问URI const assetInfo = await MediaLibrary.getAssetInfoAsync(photo.uri); const localUri = assetInfo.localUri; // 执行复制操作 const uriParts = localUri.split("."); const fileType = uriParts[uriParts.length - 1]; const time = new Date().getTime(); const newUri = `${FileSystem.documentDirectory}/${time}.${fileType}`; await FileSystem.copyAsync({ from: localUri, to: newUri, });
注意事项
- 需在
app.json的ios.infoPlist中配置权限描述:- 对于
expo-image-picker:添加"NSPhotoLibraryUsageDescription"字段 - 对于
expo-media-library:添加"NSPhotoLibraryUsageDescription"和"NSPhotoLibraryAddUsageDescription"字段
- 对于
内容的提问来源于stack exchange,提问作者Felipe Peña
相关产品推荐
相关产品推荐

