Flutter 3.44.x SPM 대응 정리

Flutter

목록 보기
1/1

Flutter iOS에서 Swift Package Manager 적용 후 꼭 확인할 것

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 프로젝트 설정을 다시 생성하도록 해야 한다.

  • iOS 최소 지원 버전 변경
  • SPM 적용 또는 패키지 구성 변경
  • Flavor 설정 변경
  • Watch 앱/Extension 타깃 추가
  • 다른 브랜치에서 iOS 설정 변경 사항을 pull 받은 경우
flutter build ios --config-only

기본 실행 명령어

iOS

flutter build ios --config-only

macOS

  • macOS 프로젝트의 설정을 갱신해야 한다면 아래 명령어를 사용한다.
flutter build macos --config-only

FVM + Flavor 프로젝트

Flavor를 사용하는 프로젝트라면 반드시 실제 실행 대상과 동일한 Flavor 및 엔트리 파일을 지정해야 한다.

fvm flutter build ios --config-only \\
  --flavor dev \\
  -t lib/app/main_dev.dart

dev 대신 사용하는 Flavor 이름을, main_dev.dart 대신 해당 환경의 엔트리 파일을 넣으면 된다.


Watch 타깃이 있는 경우

iOS 앱에 Apple Watch 앱 또는 Extension이 포함되어 있다면,
Watch 타깃도 Flutter가 생성하는 iOS 설정을 올바르게 참조해야 한다.

"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" prepare

Xcode에서 Watch 관련 타깃을 확인한다.

  • Scheme: watch
  • Build Settings From: Runner

Watch 타깃이 Runner의 빌드 설정을 올바르게 참조하지 못하면, 최소 iOS 버전이나 빌드 설정이 서로 다르게 적용될 수 있다.


팀원이 SPM 대응을 했다면

팀원이 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 최소 버전이 맞는지 확인하기

예를 들어 프로젝트의 실제 최소 지원 버전이 iOS 16인데,
Xcode에서 Flutter 패키지가 13.0처럼 이전 값이 보일 수 있다.

이때는 다음 순서로 확인한다.

  1. Xcode에서 ios 프로젝트를 연다.
  2. Runner와 관련 타깃의 Deployment Target을 확인한다.
  3. Flutter 폴더 혹은 XCode의 Dependency list 에 'FlutterGeneratedPluginSwiftPackage' 를 확인한다.
  4. 값이 예상과 다르면 --config-only 명령어를 다시 실행한다.
fvm flutter build ios --config-only \\
  --flavor dev \\
  -t lib/app/main_dev.dart
  1. Xcode를 다시 확인한다.


중요한 점: Flutter 실행 중 값이 바뀌는 것은 정상

다음 명령어로 앱을 실행하면 Flutter가 iOS 설정을 다시 구성하는 과정에서
Xcode의 Deployment Target 값 혹은 "FlutterGeneratedPluginSwiftPackage"이
일시적으로 이전 값처럼 보일 수 있다.

fvm flutter run --flavor dev -t lib/app/main_dev.dart

빌드가 진행되면서 프로젝트가 다시 동기화되고, 최종적으로 설정한 최소 iOS 버전으로 복귀한다면 정상 동작이다.

즉, Xcode에서 값을 확인할 때는 다음을 같이 봐야 한다.

  • Flutter 실행 전 값
  • flutter run 빌드 중 값
  • 빌드 완료 후 최종 값
  • 실제 기기 또는 시뮬레이터 실행 여부

단순히 특정 순간에 13.0이 보인다는 이유만으로 즉시 오류라고 판단하면 안 된다.


문제가 있는 경우의 기준

다음 상태라면 설정 동기화가 제대로 되지 않은 가능성이 높다.

  • --config-only 실행 후에도 최소 iOS 버전이 계속 잘못 표시된다.
  • flutter run 완료 후에도 의도한 Deployment Target으로 복귀하지 않는다.
  • Runner와 Watch 타깃의 최소 iOS 버전이 서로 다르다.
  • 팀원이 작업한 브랜치를 pull 받은 뒤에만 iOS 빌드가 실패한다.
  • TestFlight 업로드 또는 Archive 단계에서 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까지 삭제한 뒤 다시 실행한다.


배포 전 체크리스트

  • 최신 브랜치와 iOS 설정 변경 사항을 pull 받았다.
  • Xcode를 종료한 상태에서 설정 동기화를 실행했다.
  • fvm flutter clean을 실행했다.
  • fvm flutter pub get을 실행했다.
  • fvm flutter build ios --config-only를 실행했다.
  • Flavor 프로젝트라면 Flavor와 엔트리 파일을 정확히 지정했다.
  • Runner와 Watch 타깃의 Build Settings를 확인했다.
  • 실제 최소 iOS 버전이 Xcode에 최종 반영되었는지 확인했다.
  • fvm flutter run --flavor dev -t lib/app/main_dev.dart로 정상 실행을 확인했다.

마무리 하면서

플러터와 iOS를 병행 하고 있다보니 이번엔 플러터도 글을 작성해 보자해서 간단히 작성한
내용이옵니다.
CocoaPods 가 이제 역사속으로 Bye 하게 되어서 Flutter 측에선 SPM 대응을 시도한 것 같은데
꽤나 불안정해 보인다 라는 생각이 드는 부분이구요.
저의 예측이지만 후에 Flutter 에선 Tuist 를 내장하지 않을까...? 라는 추측도 해보았네요
( 멀티 모듈, SPM 둘다할겸 )

Flutter 가 요즘 많이 힘들어 지고 있기는 하네요 리퀴드 글래스부터 대응 해야할게 많은데
대응이 너무 늦춰지고 있어서 말이죠.

암튼 다음에 뵙도록 하죠.

profile
IOS 개발자 새싹이, 작은 이야기로부터

0개의 댓글