App端不可用uni.getFileSystemManager,须改用plus.io.requestFileSystem;需配置Android/iOS权限,区分PRIVATE_DOC与PUBLIC_DOCUMENTS路径,读写JSON须监听onwriteend/onloadend事件。
uni.getFileSystemManager 在 App 端基本不可用
它在微信小程序里能跑,但在 uni-app 编译为 app(android/ios)时,uni.getfilesystemmanager 返回的对象是空的,调用 writefile 或 readfile 会直接报错或静默失败——这不是 bug,是平台能力缺失。app 端文件操作必须走 5+ api 的 plus.io 体系。
- 只在 H5 和小程序平台可用;App 平台必须切换到
plus.io.requestFileSystem - 别在
process.env.UNI_PLATFORM === 'app-plus'下尝试封装统一的fs实例 - 调试时注意:HBuilderX 的「运行到手机」和真机打包行为一致,但本地模拟器可能掩盖权限问题
安卓需手动配权限,iOS 需声明 NSPhotoLibraryUsageDescription
没配权限,plus.io.requestFileSystem 会直接 fail,错误信息通常是 Permission denied 或 Operation not permitted,而不是具体提示缺哪个权限。
- Android:打开
manifest.json→ “App 权限配置” → 勾选READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE(Android 10+ 还建议开启requestLegacyExternalStorage) - iOS:在
manifest.json→ “iOS 模块配置” → 添加NSPhotoLibraryUsageDescription字符串(哪怕你只读文档目录,iOS 也会卡在这里) - 权限不是“一次授权永久有效”:用户可在系统设置里随时关闭,每次进文件功能前都得用
plus.android.hasPermission或plus.ios.checkPermission动态检测
选对文件系统类型,否则写进去也找不到
plus.io.PRIVATE_DOC 和 plus.io.PUBLIC_DOCUMENTS 表面都是“可读写”,但行为差异极大:前者 App 卸载即清空,后者类似电脑的“我的文档”,用户能通过文件管理器直接看到、删掉,甚至被其他 App 访问。
- 存配置、缓存、临时数据 → 用
plus.io.PRIVATE_DOC(路径如_doc/xxx.json) - 存用户导出的 PDF、日志、备份文件 → 用
plus.io.PUBLIC_DOCUMENTS(路径如Documents/backup_20260317.zip) - 千万别用
plus.io.PRIVATE_WWW写入——它是只读资源目录,强行写会失败且不报错 - 路径拼接别手写斜杠:
plus.io.convertLocalFileSystemURL(fileEntry.fullPath)才是安全的 URL 格式
读写 JSON 文件最常踩的坑:编码 + 异步时机
用 fileWriter.write(JSON.stringify(data)) 很自然,但漏掉 fileWriter.onwriteend 就直接退出,文件实际没写完;而读取时若没等 fileReader.onloadend 就 return,拿到的是 undefined。
- 写入必须监听
writer.onwriteend,不是onwrite(后者只表示开始写) - 读取必须等
filereader.onloadend,不能只靠onload(iOS 上onload可能不触发) - 字符串写入默认是 UTF-8,但若内容含 emoji 或特殊符号,建议显式传
'utf-8'编码参数 - 大文件(>1MB)别一次性读进内存,改用
file.slice()分块处理,否则 iOS 容易卡死或崩溃










