React Native安卓端react-native-background-downloader报UNKNOWN_IO_ERROR下载失败求解
解决react-native-background-downloader的UNKNOWN_IO_ERROR问题
以下是针对该错误的常见排查和解决步骤:
检查存储权限配置
- Android:针对Android 12及以下版本,需申请
WRITE_EXTERNAL_STORAGE权限;Android 13+需申请READ_MEDIA_VIDEO或MANAGE_EXTERNAL_STORAGE(按需选择),且必须动态请求权限。示例代码:import { PermissionsAndroid } from 'react-native'; const granted = await PermissionsAndroid.request( PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE, { title: '存储权限申请', message: '需要访问存储以保存下载文件' } ); if (granted !== PermissionsAndroid.RESULTS.GRANTED) return; - iOS:在
Info.plist中添加NSDocumentsFolderUsageDescription或NSDownloadsFolderUsageDescription字段,填写权限使用说明,否则系统会拒绝存储访问。
- Android:针对Android 12及以下版本,需申请
确保下载路径合法可写
- 不要使用硬编码路径,依赖react-native-fs等工具获取系统标准目录,比如:
import RNFS from 'react-native-fs'; // Android下载目录,iOS文档目录 const basePath = Platform.OS === 'android' ? RNFS.DownloadDirectoryPath : RNFS.DocumentDirectoryPath; const downloadPath = `${basePath}/safe_filename.mp4`; - 提前确认目录存在,不存在则创建:
const exists = await RNFS.exists(basePath); if (!exists) await RNFS.mkdir(basePath);
- 不要使用硬编码路径,依赖react-native-fs等工具获取系统标准目录,比如:
验证下载链接与网络环境
- 用
curl或浏览器直接访问下载链接,确认返回200状态码且文件可正常下载,比如执行curl -I https://your-video-url.mp4查看响应头。 - 避免使用带重定向的链接,部分服务器的302/301跳转可能触发IO错误,需直接使用最终的文件地址。
- 关闭代理、VPN或防火墙,这类网络工具可能拦截下载请求导致IO异常。
- 用
检查库版本与原生配置
- 升级react-native-background-downloader到最新稳定版:
npm install react-native-background-downloader@latest - Android端:确保
AndroidManifest.xml中添加了前台服务配置(Android 12+必填):<service android:name="com.transistorsoft.rnbackgrounddownloader.DownloadService" android:foregroundServiceType="dataSync"/> - iOS端:在Xcode项目的
Signing & Capabilities中开启Background Modes,勾选Background fetch和Remote notifications。
- 升级react-native-background-downloader到最新稳定版:
处理文件名与磁盘状态
- 文件名避免包含中文、空格、特殊符号(如
/、:),可替换为安全字符:const safeFilename = originalFilename.replace(/[^a-zA-Z0-9.-]/g, '_'); - 检查设备磁盘空间是否充足,磁盘满会直接触发IO错误。
- 文件名避免包含中文、空格、特殊符号(如
开启调试日志定位细节
- Android:在Logcat中过滤
DownloadService标签,查看更详细的错误堆栈,定位具体IO问题(如文件被占用、权限被拒绝)。 - iOS:通过Xcode控制台查看原生日志,获取比JS层更具体的错误信息。
- Android:在Logcat中过滤
内容的提问来源于stack exchange,提问作者Sajib saha
相关产品推荐
相关产品推荐

