React Native中RNFetchBlob在Android 11及以上版本无法运行如何解决
RNFetchBlob Android 11+ 适配修改方案
核心原因是Android 11(API 30)引入了强制分区存储机制,RNFetchBlob旧版本的默认存储逻辑、权限申请规则不再适配新版系统要求,可按以下步骤修改:
1. AndroidManifest.xml 配置调整
- 新增
android.permission.INTERNET权限(如果之前未配置),该权限是所有网络请求的基础权限 - 保留
android:requestLegacyExternalStorage="true"属性到application节点,用于兼容Android 10系统 - 如果你的业务不需要将文件存储到公共目录供其他应用访问,可直接移除
READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE权限的声明和动态申请逻辑,这两个权限在Android 11+对普通应用完全失效
2. 存储路径修改(核心适配点)
RNFetchBlob旧代码中常用的fs.dirs.DownloadDir、fs.dirs.SDCardDir等公共目录路径,在Android 11+下普通应用无直接读写权限,需调整路径规则:
- 优先使用应用私有沙盒路径,不需要任何存储权限,全安卓版本兼容:
- 临时缓存文件使用
RNFetchBlob.fs.dirs.CacheDir - 持久化存储的内部文件使用
RNFetchBlob.fs.dirs.DocumentDir
- 临时缓存文件使用
- 适配示例:
旧版本错误写法:
沙盒存储兼容写法:// 直接写入公共下载目录,Android11+无权限 RNFetchBlob.config({ path: RNFetchBlob.fs.dirs.DownloadDir + "/report.pdf" }).fetch('GET', 'https://example.com/report.pdf')
若必须存储到公共目录(如下载的文件需要用户在系统文件管理器中查看),使用系统下载管理器适配:// 写入应用私有目录,无需权限 RNFetchBlob.config({ path: RNFetchBlob.fs.dirs.DocumentDir + "/report.pdf" }).fetch('GET', 'https://example.com/report.pdf')RNFetchBlob.config({ addAndroidDownloads : { useDownloadManager : true, notification : true, title: '业务报表.pdf', description : '文件下载完成', mime : 'application/pdf', path: RNFetchBlob.fs.dirs.DownloadDir + "/report.pdf", mediaScannable : true, } }).fetch('GET', 'https://example.com/report.pdf')
3. 依赖版本调整
- 首先将RNFetchBlob升级到
0.12.0及以上正式版本,低于该版本的库完全未做Android 11适配 - 若升级后仍有兼容问题,可替换为社区维护的分支
react-native-blob-util,该分支修复了大量原版RNFetchBlob在高版本安卓、iOS系统的兼容问题,API和原版完全一致,只需修改引用包名即可
4. 权限逻辑调整
- 如果业务必须访问全量存储权限,需声明
MANAGE_EXTERNAL_STORAGE权限,同时引导用户跳转至系统设置页手动开启,无法通过普通弹框申请权限 - 仅使用应用沙盒路径的场景,可直接删除所有存储权限相关的申请、校验逻辑,减少多余代码
内容的提问来源于stack exchange,提问作者teams live
相关产品推荐
相关产品推荐

