Flutter 项目在 macOS 上运行问题处理记录
记录日期:2026-07-30
项目路径:/Users/lijun/Documents/code/fityun_admin.fityun.cn
项目名称:fityun_admin
记录目的:记录本次从 Windows 源码迁移到 macOS 后的运行问题、解决过程和后续自查方法。
最终结果
Android 和 iOS 都已经在本机实际构建、安装并运行成功。
Android:
- 设备:
sdk gphone64 arm64 - 设备 ID:
emulator-5554 - 系统:Android 14,API 34
- 运行命令:
flutter run -d emulator-5554
iOS:
- Simulator:
18ios16 - 系统:iOS 18.2
- 设备 ID:
CA4327DB-6E0D-4CED-AE84-4221D6BD2D2F - 运行命令:
flutter run -d CA4327DB-6E0D-4CED-AE84-4221D6BD2D2F
iOS 已经完成 Xcode 编译、签名、安装,并在 Simulator 中显示“菲特云声明”页面。
本机环境
- macOS:
macOS 26.6 - Flutter:
3.24.3 - Dart:
3.5.3 - Flutter SDK:
/Users/lijun/Documents/flutter - Android SDK:
/Users/lijun/Library/Android/sdk - Java:Temurin 17.0.18
- Xcode:
26.6,Build17F113 - Android Studio:
2026.1 - CocoaPods:
1.16.2
Flutter doctor 检查结果:Flutter、Android SDK、Xcode、Android Studio、Android 模拟器和网络环境全部通过。
一、Android 最初报错
最初 Flutter 报错:
Flutter failed to run
Please ensure that the SDK and/or project is installed in a location
that has read/write permissions for the current user.
Flutter 的这条提示比较泛,实际原因不是普通读写权限,而是 macOS 禁止直接执行 android/gradlew。
直接进入 Android 目录运行:
cd /Users/lijun/Documents/code/fityun_admin.fityun.cn/android
./gradlew --version
真实错误:
zsh: operation not permitted: ./gradlew
使用 shell 解释器运行同一个脚本可以成功:
bash ./gradlew --version
这说明 Gradle wrapper 内容本身没有问题,问题在 macOS 对文件执行权限的额外限制。
检查文件扩展属性:
xattr -l android/gradlew
发现:
com.apple.quarantine: ...;Feishu;
二、Android 问题解决方式
源码是通过 Feishu 从 Windows 传到 macOS 的。macOS 会给从聊天软件、浏览器等来源获得的文件增加 com.apple.quarantine 隔离标记。
Windows 没有这个扩展属性,所以同一份源码在 Windows 可以直接运行,在 macOS 可能出现“权限不足”或“operation not permitted”。
处理命令:
cd /Users/lijun/Documents/code/fityun_admin.fityun.cn
xattr -d com.apple.quarantine android/gradlew
chmod +x android/gradlew
检查:
xattr -l android/gradlew
只要 com.apple.quarantine 不再存在即可。com.apple.provenance 通常不影响执行,不需要处理。
注意:
- 一般不需要
sudo chmod +x是普通执行权限处理xattr -d是移除 macOS 文件隔离标记- 这不是升级 Flutter,也不是修改项目依赖
- 如果以后重新从 Feishu 下载源码,可能需要再次执行
三、iOS 第一个问题:CocoaPods 脚本被隔离
Android wrapper 修复后,iOS Simulator 开始构建,但出现:
WechatOpenSDK-XCFramework-xcframeworks.sh:
/bin/sh: bad interpreter: Operation not permitted
具体脚本:
/Users/lijun/Documents/code/fityun_admin.fityun.cn/ios/Pods/Target Support Files/WechatOpenSDK-XCFramework/WechatOpenSDK-XCFramework-xcframeworks.sh
检查:
xattr -l \
"ios/Pods/Target Support Files/WechatOpenSDK-XCFramework/WechatOpenSDK-XCFramework-xcframeworks.sh"
同样发现:
com.apple.quarantine: ...;Feishu;
处理:
xattr -d com.apple.quarantine \
"ios/Pods/Target Support Files/WechatOpenSDK-XCFramework/WechatOpenSDK-XCFramework-xcframeworks.sh"
如果整个 iOS 目录刚刚重新下载,也可以尝试:
xattr -dr com.apple.quarantine ios
不过 CocoaPods 目录里有些文件权限比较特殊,递归命令可能输出很多 Permission denied。这时不要反复清理整个目录,直接根据 Xcode 报错中显示的具体脚本路径执行 xattr -d 即可。
四、iOS 第二个问题:Xcode 26.6 和旧版网络库不兼容
隔离标记处理后,Xcode 继续构建,并出现:
Use of private header from outside its module: 'netinet6/in6.h'
涉及的旧代码包括:
ios/Pods/QCloudCore/QCloudCore/Classes/Base/QCLOUDRestNet/reachability/QCloudReachability.m
ios/Runner/Third/AFNetworking/AFNetworking/AFHTTPSessionManager.m
ios/Runner/Third/AFNetworking/AFNetworking/AFNetworkReachabilityManager.m
这些旧文件中存在:
#import <netinet6/in6.h>
当前代码已经通过:
#import <netinet/in.h>
提供了所需的网络结构定义,netinet6/in6.h 在这几个文件中没有额外实际使用。Xcode 26.6 对这个私有头文件的限制更严格,因此直接编译失败。
五、实际修改的文件
1. ios/Podfile
在 post_install 中增加了兼容处理:
- 找到 CocoaPods 生成的 QCloudCore 文件
- 移除
#import <netinet6/in6.h> - 将生成文件恢复为可读写权限
- 每次
pod install后自动执行
这样以后重新执行 pod install,QCloudCore 的修改不会丢失。
2. ios/Runner/Third/AFNetworking/AFNetworking/AFHTTPSessionManager.m
移除:
#import <netinet6/in6.h>
保留其他网络头文件和 IPv6 相关代码。
3. ios/Runner/Third/AFNetworking/AFNetworking/AFNetworkReachabilityManager.m
移除:
#import <netinet6/in6.h>
保留 IPv6 的 sockaddr_in6 代码。
4. macOS 文件扩展属性
清理了以下构建脚本上的 com.apple.quarantine:
android/gradlewios/Pods/Target Support Files/WechatOpenSDK-XCFramework/WechatOpenSDK-XCFramework-xcframeworks.sh
扩展属性不会显示为普通 Git 源码差异,也不会形成正常的 Git commit 内容。
六、关于依赖和锁文件
本次没有升级 Flutter、Xcode、Android Studio 或 Dart 依赖。
执行过:
flutter pub get
它只是根据现有 pubspec.lock 恢复依赖,输出中显示的 “newer versions available” 只是提示,不代表已经升级。
执行 pod install 时,因为当前 CocoaPods 是 1.16.2,而原锁文件记录的是 1.15.2,ios/Podfile.lock 曾经出现 checksum 和 CocoaPods 版本记录变化。这些变化不代表依赖升级,后来已恢复,最终没有保留 ios/Podfile.lock 的变更。
七、以后推荐的启动方式
先检查设备:
flutter devices
Android:
flutter run -d emulator-5554
iOS:
flutter run -d CA4327DB-6E0D-4CED-AE84-4221D6BD2D2F
Xcode 中打开项目时优先打开:
/Users/lijun/Documents/code/fityun_admin.fityun.cn/ios/Runner.xcworkspace
不要优先打开 Runner.xcodeproj,因为 CocoaPods 依赖是在 workspace 中加载的。
八、以后遇到类似问题的排查顺序
Android 出现 operation not permitted
cd /Users/lijun/Documents/code/fityun_admin.fityun.cn
xattr -l android/gradlew
xattr -d com.apple.quarantine android/gradlew
chmod +x android/gradlew
flutter run -d emulator-5554
iOS 出现 bad interpreter: Operation not permitted
- 从 Xcode 日志中找到具体
.sh文件。 - 检查扩展属性:
xattr -l "报错中的脚本路径"
- 移除隔离标记:
xattr -d com.apple.quarantine "报错中的脚本路径"
iOS 出现 netinet6/in6.h
找到报错的 .m 文件,搜索:
#import <netinet6/in6.h>
确认代码同时引入了:
#import <netinet/in.h>
如果没有使用 netinet6/in6.h 特有内容,可以移除这一行。当前项目的 QCloudCore 已经通过 ios/Podfile 自动处理,AFNetworking 两个文件已经直接处理。
九、什么时候需要清缓存
本次不需要清缓存,根因是 macOS 隔离标记和旧版头文件兼容性。
只有在问题已修复,但 Xcode 仍然使用旧构建结果时,才执行:
flutter clean
cd ios
pod install
cd ..
flutter run -d CA4327DB-6E0D-4CED-AE84-4221D6BD2D2F
不要一遇到 Flutter 构建失败就删除整个 Pods、DerivedData 或升级依赖。先根据日志判断是权限、隔离标记、Pod 脚本、编译器兼容性还是实际代码错误。
十、仍然存在的应用运行时问题
Android 成功启动后,控制台还出现了两个原有 Dart 运行时问题:
首页轮播负高度
文件:
lib/pages/home/widget/home_swiper_view.dart:43
错误:
BoxConstraints has a negative minimum height
原因是首页轮播容器计算出了负高度,和本次 Android Gradle 权限问题无关。
weekController 未初始化
错误:
LateInitializationError: Field 'weekController' has not been initialized.
这个问题属于原有页面初始化逻辑问题,不影响 APK/iOS 构建和应用启动,但可能影响进入课程/日程相关页面。
当前 Git 变更
当前保留的源码变更:
ios/Podfileios/Runner/Third/AFNetworking/AFNetworking/AFHTTPSessionManager.mios/Runner/Third/AFNetworking/AFNetworking/AFNetworkReachabilityManager.m
没有创建 commit,也没有修改 Android 业务源码、Flutter 依赖版本或锁文件。
建议 commit message:
fix(ios): support Xcode 26 private header restrictions
本文来自博客园,作者:jialiangzai,转载请注明原文链接:https://www.cnblogs.com/zsnhweb/p/22077211

浙公网安备 33010602011771号