Flutter iOS真机创建文件夹报OS Error: Operation not permitted(errno=1)如何解决
Flutter iOS真机创建文件夹报权限错误解决方案
错误根因
你当前的代码尝试在iOS应用沙箱容器的根目录创建文件夹,违反了iOS的沙箱权限规则:
iOS系统对每个应用的可读写路径做了严格限制,getApplicationDocumentsDirectory()返回的Documents目录本身是官方分配的可写目录,而它的父目录是应用容器的根路径,默认没有写入权限,所以触发Operation not permitted报错。
解决方案
方案1(推荐,无需额外配置)
直接修改代码,将自定义文件夹创建在系统分配的可写目录下,比如Documents目录内,修正后的代码如下:
Future<void> ensureInitialized() async { if (!kIsWeb) { final docDir = await getApplicationDocumentsDirectory(); // 直接在Documents目录下创建自定义文件夹,不要访问父目录 dataDirectory = Directory('${docDir.path}/biyiapp-dev'); if (!dataDirectory!.existsSync()) { dataDirectory!.createSync(recursive: true); } File sessionFile = File('${dataDirectory!.path}/session.json'); if (sessionFile.existsSync()) { final String jsonString = await sessionFile.readAsString(); lastSession = Session.fromJson(json.decode(jsonString)); } } }
该方案适配iOS默认权限规则,无需修改任何原生配置即可正常运行。
方案2(特殊需求场景)
如果你确实需要访问其他沙箱路径或者开启用户可见的文件访问能力,需要修改iOS项目的Info.plist配置(路径为ios/Runner/Info.plist),添加以下可选配置:
- 如果需要开启iTunes文件共享,允许用户在iTunes中查看应用Documents目录内容:添加
UIFileSharingEnabled字段,值设为YES - 如果需要允许用户在iOS系统的「文件」APP中访问应用的Documents目录:添加
LSSupportsOpeningDocumentsInPlace字段,值设为YES
修改配置后重新编译运行即可。
注意:除非有明确的产品需求,否则不建议随意修改这些配置,默认使用系统分配的可写目录是最稳妥的实现方式。
内容的提问来源于stack exchange,提问作者Dolphin
相关产品推荐
相关产品推荐

