Apple M4芯片Mac上Flutter应用无法读取项目内配置文件(权限错误errno=1)
看起来你遇到的是Apple Silicon Mac上Flutter桌面应用的沙箱权限+路径使用不当的双重问题,我来一步步帮你排查解决:
1. 先改掉硬编码绝对路径的坏习惯
你现在直接写死了绝对路径,这不仅在项目移动/换环境时会直接失效,更关键的是:如果你运行的是Flutter macOS桌面应用(而非单纯的Dart脚本),应用的沙箱会默认限制它访问你项目目录下的文件——哪怕你给了Terminal/VSCode权限也没用,因为桌面应用是独立进程,有自己的权限沙箱。
换成相对路径结合运行时工作目录来构建路径会更可靠:
import 'dart:io'; import 'package:path/path.dart' as p; // 用相对路径(相对于项目根目录)拼接,避免硬编码 final configRelativePath = p.join( 'embedded-configurations', 'build', 'system_config', 'Gecko', 'lab_spa_config.json' ); final configPath = p.join(Directory.current.path, configRelativePath); final File file = File(configPath); final String jsonString = file.readAsStringSync();
2. 解决Flutter macOS应用的沙箱权限问题
如果你是用flutter run -d macos运行桌面应用,Flutter默认会给应用开启App Sandbox(沙箱机制),这个机制会严格限制应用的文件访问范围,和Terminal/VSCode的权限是完全分开的。
调试阶段临时关闭沙箱(最省事)
打开项目下的两个权限配置文件:
macos/Runner/DebugProfile.entitlementsmacos/Runner/Release.entitlements
把里面的com.apple.security.app-sandbox改成false:
<key>com.apple.security.app-sandbox</key> <false/>
改完后重启应用,应该就能正常读取文件了。
发布版本的权限配置(可选)
如果之后要发布应用,建议重新开启沙箱,同时添加对应目录的访问权限。比如可以在entitlements文件里添加com.apple.security.files.user-selected.read-only(允许用户手动选择文件),或者更精准的目录权限,但开发阶段临时关闭沙箱是最高效的解决方案。
3. 验证基础权限是否生效
先在终端里直接执行以下命令,确认文件本身能被正常读取:
cat /Users/denismorin/source/Flutter/eco2-test-tool/embedded-configurations/build/system_config/Gecko/lab_spa_config.json
如果终端能正常输出内容,说明系统级权限没问题,问题确实出在Flutter应用的沙箱或路径上。
另外,有时候Apple Silicon的权限设置需要重启进程才会生效,不妨重启下Terminal/VSCode甚至Mac,再试一次。
4. 更优方案:把配置文件作为Flutter Assets管理
如果你的配置文件是静态的(不会动态生成),完全可以用Flutter官方推荐的Assets方式来管理,彻底绕开文件权限问题:
- 在
pubspec.yaml里添加Assets声明:
flutter: assets: - embedded-configurations/build/system_config/Gecko/lab_spa_config.json
- 用
rootBundle读取文件:
import 'package:flutter/services.dart'; // 注意这里直接用Assets路径,不需要处理文件系统 final jsonString = await rootBundle.loadString( 'embedded-configurations/build/system_config/Gecko/lab_spa_config.json' );
按上面的步骤一步步试,应该能解决你的问题。如果还是不行,不妨告诉我你是在运行Dart脚本还是Flutter桌面应用,我再帮你进一步排查~
内容来源于stack exchange

