본문 바로가기
Language & Framework/Dart & Flutter

[Flutter/Xcode] 여러 타겟 동시에 version 관리 - Generated.xcconfig

by 6cess 2024. 4. 18.

Flutter 프로젝트에서 ios 빌드하면서 AppStore에 배포할 때 자꾸 아래와 같은 경고 이메일이 날라왔다.

 

ITMS-90473: CFBundleVersion Mismatch - The CFBundleVersion value '1' of extension 'Runner.app/PlugIns/ImageNotification.appex' does not match the CFBundleVersion value '181' of its containing iOS application 'Runner.app'.

ITMS-90473: CFBundleShortVersionString Mismatch - The CFBundleShortVersionString value '1.0' of extension 'Runner.app/PlugIns/ImageNotification.appex' does not match the CFBundleShortVersionString value '1.0.0' of its containing iOS application 'Runner.app'.

 

여기서 ImageNotification은 해당 프로젝트의 ios extension target이다. CBundleVersion과 CFBundleShortVersionString 값이 제대로 설정되지 않은게 문제인 것으로 추측된다.

 

Xcode로 해당 타겟의 info탭 그리고

 

Build Setting 탭에서 관련된 property를 찾아보았다.

 

info.plist의 Bundle version 속성과 Bundle version string (short)속성은 각각 해당 타겟의 CFBundle Version과 CFBundleShortVersionString을 표시한다.  그런데 문제는 이 속성들에 입력된 변수들이 정적인 변수들이었기 때문에 메인 타겟 Runner의 버전과 다르게 빌드되고 있었다.

 

그러면 메인 타겟은 어떻게 CFBundleShortVersionString와 CFBundleVersion을 관리하고 있을까. 메인 타겟의 info탭을 열어보자

 

 

Build Setting 탭에서 위 변수를 찾아보았다

 

메인 타겟에서는 flutter의 빌드 정보들을 변수를 User-Defined Setting으로 가지고 있다. 이 설정들은 Flutter 프레임워크가 ios 빌드할 때 변수로 넘겨주게 되는 값들이다.

 

여기서 문제는 메인 타겟은 자동으로 이 변수를 가져오고 있는데 extension 타겟은 이 변수를 참조하고 있지 않는 것이 문제인 듯 보인다. 그렇다면 extention 타겟에서 위와 같은 Flutter 빌드 정보 값을 어떻게 가져올 수 있을까.

 

Flutter가 생성해주는 configuration file인 Generated.xcconfig 

이 문제를 해결하기 위해서 Flutter가 어떻게 메인 타겟에 이 환경변수를 넣어주고 있는지부터 알아야 한다. Flutter가 ios를 빌드할 때 ios 빌드 정보를 타겟의 configuration file 형태로 전달하게 된다.

configuration file(.xcconfig)은 ios 빌드할 때 타겟 혹은 프로젝트 단위로 참조하게 되는 설정 정보들을 관리한다고 보면 된다. 이에 대한 더 자세한 정보는 문서를 참고하길..
https://developer.apple.com/documentation/xcode/configuring-the-build-settings-of-a-target/ 

 

Configuring the build settings of a target | Apple Developer Documentation

Specify the options you use to compile, link, and produce a product from a target, and identify settings inherited from your project or the system.

developer.apple.com

 

Flutter 프레임워크는 빌드 시 루트 디렉토리 기준으로 /ios/Flutter/Generated.xcconfig 이 경로로 설정파일을 생성한다.

(첫줄 주석 말대로 수동으로 수정하지 말자 Flutter 프레임워크가 빌드할 때 자동으로 작성해준다)

 

그리고 아래 Debug.xcconfig 파일처럼 Generated.xcconfig파일을 다른 설정 파일에서 참조하는 방식으로 세팅되어 있다.   

 

 

프로젝트를 선택해서  Info -> configurations 탭을 열어보면 각 타겟들은 각각 여러 설정 파일을 참조하도록 설정되어 있다. 

 

 

여기서 문제는 만약 타겟을 새로 추가했다면 그 타겟의 configuration file이 Generated.xcconfig를 포함하고 있지 않는다는 것이다.

동일한 Flutter 빌드 버전을 여러 다른 타겟에도 적용하고 싶다면 그 타겟이 참조하는 configuration file이 Generated.xcconfig 참조하도록 만들어야 한다.

 

그러므로 Flutter 빌드 버전을 가져와서 User-defined 값으로 활용하고 싶은 타겟이 있다면 위에 메인 타겟의 설정 파일들(Debug.xcconfig)처럼 해당 타겟의 .xcconfig 파일이 아래 코드로 Generated.xcconfig 값을 포함하고 있어야 한다.

#include "Generated.xcconfig"