AIGC标识 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,Build 17F113
  • 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/gradlew
  • ios/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

  1. 从 Xcode 日志中找到具体 .sh 文件。
  2. 检查扩展属性:
xattr -l "报错中的脚本路径"
  1. 移除隔离标记:
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 构建失败就删除整个 PodsDerivedData 或升级依赖。先根据日志判断是权限、隔离标记、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/Podfile
  • ios/Runner/Third/AFNetworking/AFNetworking/AFHTTPSessionManager.m
  • ios/Runner/Third/AFNetworking/AFNetworking/AFNetworkReachabilityManager.m

没有创建 commit,也没有修改 Android 业务源码、Flutter 依赖版本或锁文件。

建议 commit message:

fix(ios): support Xcode 26 private header restrictions
posted @ 2026-07-30 16:34  jialiangzai  阅读(24)  评论(0)    收藏  举报