Expo React Native生产环境无法获取照片、视频不显示问题
问题1:生产环境仅返回视频资源,无照片
可能原因及解决步骤:
权限配置不全
检查app.json中的权限配置,确保包含mediaLibrary权限,同时在infoPlist中添加正确的权限描述:{ "expo": { "permissions": ["mediaLibrary"], "ios": { "infoPlist": { "NSPhotoLibraryUsageDescription": "需要访问您的媒体库以选择照片和视频", "NSPhotoLibraryAddUsageDescription": "需要访问您的媒体库以保存内容" } } } }iOS 14+ 虽读取权限主要依赖
NSPhotoLibraryUsageDescription,但完整配置可避免权限请求异常。验证媒体类型参数
确认MediaType导入正确:import { MediaType } from 'expo-media-library';尝试拆分请求排查批量请求问题:
const photos = await MediaLibrary.getAssetsAsync({ mediaType: MediaType.photo, first: 100 }); const videos = await MediaLibrary.getAssetsAsync({ mediaType: MediaType.video, first: 100 }); const media = { assets: [...photos.assets, ...videos.assets], ...photos };检查系统权限设置
让用户在iOS设置中确认App的媒体库权限为「允许访问所有照片」,而非仅视频。
问题2:生产环境localUri无法播放视频
核心原因及解决方法:
iOS生产环境中,localUri对应的file://路径受沙盒权限限制,Expo应用无法直接访问系统原始文件路径,正确做法是使用MediaLibrary.Asset自带的uri字段:
修改媒体资源获取逻辑
移除对localUri的依赖,直接使用asset.uri:const mediaItemsWithFileUris = media.assets.map((asset: Asset) => ({ id: asset.id, uri: asset.uri, width: asset.width, height: asset.height, filename: asset.filename, duration: asset.duration, mediaType: asset.mediaType, syncStatus: SyncStatus.TO_BE_SYNCED, }));无需再调用
getAssetInfoAsync,减少不必要的异步请求。调整轮播组件的URI使用
直接使用item.uri作为媒体源:const sourceUri = item.uri;验证Video组件配置
确保expo-av已正确安装配置,Video组件使用asset.uri即可正常播放,无需额外协议转换。
内容的提问来源于stack exchange,提问作者romawu
相关产品推荐
相关产品推荐

