Flutter iOS 프로젝트에 Swift Package Manager(SPM) 를 적용한 뒤,
- 최소 iOS 버전 변경,
- Watch 타깃 추가,
- 팀원 간 브랜치 병합,
- TestFlight 배포
가 겹치면 Xcode 설정과 실제 빌드 결과가 어긋나는 문제가 발생할 수 있다.
이 글은 SPM 적용 이후 iOS 설정을 안정적으로 동기화하고 확인하는 방법을 정리한 기록이다.
참고: Flutter 공식 문서 - Swift Package Manager for app developers
--config-only가 필요한가?Flutter 프로젝트의 iOS 설정은
pubspec.yaml, Flutter 도구, Xcode 프로젝트 설정이 서로 연결되어 있다.
아래와 같이 네이티브 설정에 영향을 주는 변경이 있다면,
Flutter가 iOS 프로젝트 설정을 다시 생성하도록 해야 한다.
flutter build ios --config-only
flutter build ios --config-only
flutter build macos --config-only
Flavor를 사용하는 프로젝트라면 반드시 실제 실행 대상과 동일한 Flavor 및 엔트리 파일을 지정해야 한다.
fvm flutter build ios --config-only \\
--flavor dev \\
-t lib/app/main_dev.dart
dev 대신 사용하는 Flavor 이름을, main_dev.dart 대신 해당 환경의 엔트리 파일을 넣으면 된다.
iOS 앱에 Apple Watch 앱 또는 Extension이 포함되어 있다면,
Watch 타깃도 Flutter가 생성하는 iOS 설정을 올바르게 참조해야 한다.

"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" prepare
Xcode에서 Watch 관련 타깃을 확인한다.
watchRunnerWatch 타깃이 Runner의 빌드 설정을 올바르게 참조하지 못하면, 최소 iOS 버전이나 빌드 설정이 서로 다르게 적용될 수 있다.
팀원이 SPM 대응이나 iOS 설정 변경을 커밋했고,
내가 이를 pull 받았다면 Xcode 캐시와 기존 생성 파일 때문에 문제가 발생할 수 있다.
이 경우 Xcode를 모두 종료한 뒤, 아래 순서로 초기화한다.
fvm flutter clean
fvm flutter pub get
flutter build ios
or
fvm flutter build ios --config-only --flavor dev -t lib/app/main_dev.dart
그리고 Xcode를 다시 열어 실행한다.
위 과정 전후로 Xcode의 DerivedData도 제거하는 것이 좋다.
~/Library/Developer/Xcode/DerivedData
DerivedData는 빌드 산출물과 인덱스 캐시이므로 삭제해도 소스 코드는 영향을 받지 않는다. 다만 다음 빌드는 조금 느려질 수 있다.
예를 들어 프로젝트의 실제 최소 지원 버전이 iOS 16인데,
Xcode에서 Flutter 패키지가13.0처럼 이전 값이 보일 수 있다.

이때는 다음 순서로 확인한다.
ios 프로젝트를 연다.--config-only 명령어를 다시 실행한다.fvm flutter build ios --config-only \\
--flavor dev \\
-t lib/app/main_dev.dart

다음 명령어로 앱을 실행하면 Flutter가 iOS 설정을 다시 구성하는 과정에서
Xcode의 Deployment Target 값 혹은 "FlutterGeneratedPluginSwiftPackage"이
일시적으로 이전 값처럼 보일 수 있다.
fvm flutter run --flavor dev -t lib/app/main_dev.dart
빌드가 진행되면서 프로젝트가 다시 동기화되고, 최종적으로 설정한 최소 iOS 버전으로 복귀한다면 정상 동작이다.
즉, Xcode에서 값을 확인할 때는 다음을 같이 봐야 한다.
flutter run 빌드 중 값단순히 특정 순간에 13.0이 보인다는 이유만으로 즉시 오류라고 판단하면 안 된다.
다음 상태라면 설정 동기화가 제대로 되지 않은 가능성이 높다.
--config-only 실행 후에도 최소 iOS 버전이 계속 잘못 표시된다.flutter run 완료 후에도 의도한 Deployment Target으로 복귀하지 않는다.이 경우 아래 초기화 순서를 다시 수행한다.
fvm flutter clean
fvm flutter pub get
fvm flutter build ios --config-only --flavor dev -t lib/app/main_dev.dart
필요하면 Xcode를 종료하고 DerivedData까지 삭제한 뒤 다시 실행한다.
fvm flutter clean을 실행했다.fvm flutter pub get을 실행했다.fvm flutter build ios --config-only를 실행했다.fvm flutter run --flavor dev -t lib/app/main_dev.dart로 정상 실행을 확인했다.플러터와 iOS를 병행 하고 있다보니 이번엔 플러터도 글을 작성해 보자해서 간단히 작성한
내용이옵니다.
CocoaPods 가 이제 역사속으로 Bye 하게 되어서 Flutter 측에선 SPM 대응을 시도한 것 같은데
꽤나 불안정해 보인다 라는 생각이 드는 부분이구요.
저의 예측이지만 후에 Flutter 에선 Tuist 를 내장하지 않을까...? 라는 추측도 해보았네요
( 멀티 모듈, SPM 둘다할겸 )Flutter 가 요즘 많이 힘들어 지고 있기는 하네요 리퀴드 글래스부터 대응 해야할게 많은데
대응이 너무 늦춰지고 있어서 말이죠.암튼 다음에 뵙도록 하죠.