플러터에서 Flavor를 사용해서 iOS 개발 환경 분리 및 변수 설정
이전 포스팅에서는 플러터에서 특히 안드로이드에 대한 개발 환경 분리와 개발환경별로 변수를 설정하는 방법을 봤습니다.
https://android-developer.tistory.com/100
플러터에서 Flavor를 사용해서 개발 환경 분리 및 예시
플러터에서는 Flavor를 사용하여 개발환경을 바꿀 수 있습니다. 라이브러리를 사용하거나 하면 한 번에 바꿀 수 있다고 하지만... 플러터에 라이브러리를 추가하가는 것을 결과적으로 앱 자체의
android-developer.tistory.com
이번에는 iOS에 대해 플러터에서 어떻게 개발 환경을 나누고 분리할 수 있는지 알아보겠습니다.
아래의 과정을 진행하기 전에 반드시 Flavor를 나누지 않은 상태에서 ios 앱 실행이 되는지 확인해 보시길 바랍니다.
플러터에서 Flavor를 사용하여 개발 환경 분리 하고 변수 선언하기 - iOS
플러터에서 iOS의 Flavor를 나누는 방법은 다음과 같습니다.
1. XCode를 사용해서 현재 프로젝트의 Runner.xcworkspace를 열어줍니다.
프로젝트 루트 경로/iOS/Runner.xcworkspace에 있습니다.
해당 파일을 더블클릭하면 자동으로 Xcode로 프로젝트를 열어줍니다.
2. Runner에서 새로운 Configuration 만들기
Xcode의 Runner에 들어가서
다음과 같이 새롭게 Debug, Release에 대한 Configuration을 만듭니다.
주의할 점은 Debug에 대한건 Debug를 사용해서 Duplicate 해야 하고
Release에 대한건 Release를 사용해서 Duplicate 해야 합니다.
이름은 Debug-xxx 또는 Release-xxx 같은 형식을 사용해야 합니다.
저는 다음과 같이 6개를 만들었습니다.
- Debug-dev: 디버깅할 때 or 테스트할 때 사용할 빌드
- Debug-product: 배포 환경에서 테스트할 때 사용할 빌드
- Release-product: 배포할 앱을 만들 때 사용할 빌드
- Release-dev: 배포용 앱을 테스트할 때 사용할 빌드
- Profile-dev: 디버깅할 때 앱 상태를 확인
- Profile-release: 배포할 앱의 상태를 확인
3. 각각의 빌드 환경에 대한 Scheme 만들기
빌드에 대한 이름과 환경을 만들었으니 iOS 프로젝트에서 해당 빌드를 인식할 수 있게 Scheme을 새롭게 만들어줘야 합니다.
다음과 같이 New scheme을 클릭해서 위에서 만든 Runner에 대한 Scheme을 만듭니다.
위에서 생성한 dev, product에 대한 Scheme을 만듭니다.
저는 다음과 같이 2개를 만들었습니다.
2개만 만든 이유는 다음과 같습니다.
product에서 설정 변경을 통해 앱을 만들고 일반적인 경우에는 Debug-product로 사용할 예정이기 때문에
Scheme을 만든 이후 Manage Schemes에 들어가서 Shared에 반드시 체크가 되어있는 것을 확인해야 합니다.
(Scheme은 생성 시 기본적으로 Shared 설정이 되어있음)
그리고 생성한 Scheme과 연결을 해줘야 합니다.
다음과 같이 현재 scheme을 변경한 다음에
Edit Scheme에 들어가서 다음과 같이 Build Configuration을 처음에 만든 Configuration으로 바꿔줍니다.
Run뿐 아니라 Test, Profile, Analyze, Archive에 대해서도 다음과 같이 실시합니다.
위 과정을 dev뿐 아니라 product에도 해줍니다.
product 환경에서 테스트를 할 거면 Debug-dev
앱을 만들 거면 Release-product로 만들어줍니다.
4. 빌드 환경이 제대로 나눠졌는지 확인하기
여기까지 했으면 플러터에서 iOS의 빌드 환경에 정상적으로 나누어졌는지 확인할 수 있습니다.
실행은 다음과 같은 커맨드로도 할 수 있지만
flutter run --flavor dev
Android Studio를 사용한다면 다음과 같은 Configuration 정의를 통해 빌드도 가능합니다.
다음과 같이 Edit Configurations를 클릭합니다.
(저는 이미 만들었기 때문에 dev와 product가 있는 것을 볼 수 있습니다.)
왼쪽 위에 (+) 버튼을 눌러서 dev를 만들어 줍니다.
안에는 다음과 같이 정의합니다.
(Build flavor는 반드시 위에서 만든 dev, product와 이름이 일치해야 합니다.)
위와 같이 정의한 후 실행된다면 일단 성공입니다.
똑같은 방법으로 product도 만듭니다.
5. 빌드 환경별로 다른 패키지명 갖게 하기
제대로 빌드 환경이 나뉘어있다는 것을 확인했으니 이제 플러터를 실행했을 때 서로 다른 앱이 되도록 하겠습니다.
패키지명이 다르다면 서로 다른 앱으로 인식하기 때문에 iOS도 똑같이 빌드 버전별로 서로 다른 패키지명을 갖도록 변경하겠습니다.
Target - Runner - Build Setttings - Basic - Combined에 들어갑니다.
Product Bundle Identifier 부분을 보면 지금까지 생성한
- Debug-dev
- Debug-product
- Release-product
를 볼 수 있습니다.
여기서 각각 com.~~~으로 되어있는 부분을 수정하면
패키지명을 변경할 수 있습니다.
일반적으로는 제일 끝에 해당 빌드 이름을 붙입니다.
예를 들면 dev의 경우
com.~~~.dev
product의 경우
com.~~~.product
가 됩니다.
저는 다음과 같이 변경했습니다.
6. Flavor별 앱 이름 설정하기
- 프로젝트 내비게이터에서 Runner를 선택하고, TARGETS에서 다시 Runner를 선택합니다.
- 상단의 Build Settings 탭으로 이동합니다.
- '+' 버튼을 눌러 Add User-Defined Setting을 선택합니다.
- 새로운 변수의 이름을 APP_DISPLAY_NAME으로 지정합니다.
- APP_DISPLAY_NAME 변수를 펼쳐서 각 Flavor 설정에 맞는 앱 이름을 입력합니다. (예: Debug-dev와 Release-dev에는 '나의 앱 Dev', Debug-product와 Release-product에는 '나의 앱')
이후 Info.plist 파일을 수정합니다.
- Xcode의 프로젝트 내비게이터에서 Runner 폴더 아래의 Info.plist 파일을 엽니다.
- 키(Key) 목록에서 Bundle display name (실제 키: CFBundleDisplayName)을 찾습니다.
- 만약 이 키가 없다면, 마지막 줄에서 '+' 버튼을 눌러 Bundle display name을 추가합니다.
- Bundle display name의 값(Value)을 $(APP_DISPLAY_NAME)으로 설정합니다.
이제 다시 XCode에서 Scheme을 설정하고 앱을 Build 하면 새로운 이름으로 앱이 설치되는 것을 볼 수 있습니다.
7. 플러터 iOS에서 사용할 수 있는 빌드 환경별 상수 만들기
플러터 iOS에서 빌드 환경별로 사용할 수 있는 상수를 Run 할 때 커맨드로 넣어줄 수 있습니다.
예를 들면 다음과 같습니다.
flutter run --flavor dev --dart-define=ENVIRONMENT=dev --dart-define=API_URL=https://dev.api.example.com
위와 같이 커맨드를 입력하여 실행하면 다음과 같이 실행됩니다.
- dev라는 이름의 flavor로 실행해라
- 이때 ENVIRONMENT와 API_URL이라는 상수를 만들어서 실행해라.
이렇게 지정한 상수는 Flutter에서 다음과 같이 사용할 수 있습니다.
const url = String.fromEnvironment('API_URL', defaultValue: "");
하지만, 매번 이렇게 커맨드로 입력하기는 귀찮죠??
그렇기 때문에 다음과 같은 방법을 사용할 수 있습니다.
Android Studio에서 Configuration에 추가 커맨드 지정하기
위에서 정의한 Configuration에 추가로 커맨드를 넣어줄 수 있습니다.
예를 들어 dev에 다음과 같이 지정하면 됩니다.
위와 같이 하면 매번 해당 Configuration으로 실행할 때마다 Production이라는 String 값을 env라는 상수에 넣어서 실행해 줍니다.
8. flavor별로 xcconfig 파일 만들기
여기까지만 하더라도 실행은 가능하지만 flavor별로 xcconfig 파일을 만드는게 좋습니다.
위 예시에서 제가 만든 ios의 build scheme은 다음과 같이 여섯 종류가 있습니다. (Profile은 제외)
- Debug-dev
- Debug-product
- Release-dev
- Release-product
각각의 build scheme에 대해 xcconfig 파일을 만들어줍니다.
파일을 만들 때는 각각의 원본 파일을 복사해서 만들면됩니다.
예시: Debug-product.xcconfig일 경우 Debug-xcconfig를 복사해서 만든다.
그렇게 해서 ios/Flutter에 다음과 같은 네 개의 파일을 만듭니다.
Debug-dev.xcconfig
// 1. Flutter의 기본 디버그 설정을 모두 가져옵니다 (이 안에 Generated.xcconfig가 포함되어 있음).
#include "Flutter/Debug.xcconfig"
// 2. dev Flavor에만 해당하는 Pod 설정을 덧붙입니다.
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug-dev.xcconfig"
Release-dev.xcconfig
// 1. Flutter의 기본 릴리즈 설정을 모두 가져옵니다 (이 안에 Generated.xcconfig가 포함되어 있음).
#include "Flutter/Release.xcconfig"
// 2. dev Flavor에만 해당하는 Pod 설정을 덧붙입니다.
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release-dev.xcconfig"
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.profile-dev.xcconfig"
Debug-product.xcconfig
#include "Flutter/Debug.xcconfig"
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug-product.xcconfig"
Release-product.xcconfig
#include "Flutter/Release.xcconfig"
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release-product.xcconfig"
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.profile-product.xcconfig"
각각의 scheme들이 생성한 파일들을 참조할 수 있도록 변경해야합니다.
1. (PROJECT) Runner -> 특정 scheme -> Add Configuration File... 을 클릭한다.
2. 생성한 4개의 파일을 클릭해서 추가한다. (이때 추가한 파일이 /Runner/Flutter 안이 아니라 /Runner 안에 생성되었다면 /Runner/Flutter 안으로 옮겨준다.)
3. 각각의 Scheme에 올바른 xcconfig를 참조하도록 바꿔준다.
(주의해야하는 것은 Profile 부분도 똑같이 맞춰서 바꿔줘야합니다.)
4. 프로젝트/ios에서 다음과 같은 커맨드를 실시한다.
pod install
Trouble shooting
https://android-developer.tistory.com/100
플러터에서 Flavor를 사용해서 개발 환경 분리 및 예시
플러터에서는 Flavor를 사용하여 개발환경을 바꿀 수 있습니다. 라이브러리를 사용하거나 하면 한 번에 바꿀 수 있다고 하지만... 플러터에 라이브러리를 추가하가는 것을 결과적으로 앱 자체의
android-developer.tistory.com