Target 을 2 개로 나누고, 각각 Info.plist 를 이용하여, 다른 환경에서 동작하도록 한다.
프로젝트 파일 위치 : https://github.com/kipsong133/TIL/tree/main/2022/04/05
실제 프로덕트를 운영하는 팀에서, 하나의 Target으로만 앱을 구성하진 않을겁니다. 이름은 여러가지겠지만, 맥락은 같으리라 봅니다. "로컬 / 개발용 / 통합 / QA(혹은 RC=Release Candidate) / Staging / Production" 으로 나뉩니다. (나누는 기준은 맥락에 맞게 유연하게 하리라 생각함.) 이렇게 프로젝트를 나눠서 관리해야, 현재 상용화되고 있는 앱에 영향을 주지 않으면서 동시에 개발하기에 용이합니다. 이것을 "개발 환경 분리" 라고 합니다.
개발환경 분리란, 개발 환경(Phase) 는 어플리케이션이 동작하는 '환경' 을 의미합니다. 개발환경을 그렇다면 왜 분리할까요?
이유는 "목적에 맞는 다양한 환경조성" 입니다. 각 단계별 자세한 내용은 아래 글을 참조해보시면 큰 도움이 될겁니다.
공식문서 : https://developer.apple.com/library/archive/featuredarticles/XcodeConcepts/Concept-Targets.html
Target 은 빌드하게될 product를 선택합니다. 그리고 빌드할 때, 어떤식으로 빌드할 지, 설정들을 위한 Resource&Source 를 가지고 있습니다. (ex. Asset / Xib / Info.plist / swift파일들)Target : product = 1: 1 관계입니다. 동시에, Project : Target = 1 : N 관계 입니다. 정리하면, 하나의 프로젝트에는 다수의 타겟이 있고 다수의 타겟 갯수 만큼 프로덕트가 있습니다.
Target 은 다른 Target 에 의존할 수 있습니다. (하나가 다른 하나에 종속된다는 뜻) Xcode 가 알아서 두 Target의 종속성을 파악하고 순서대로 빌드합니다. 이러한 관계를 "암시적 종속성" 이라고 합니다. 또한 이를 커스텀하게 종속하지 않도록 할 수도 있습니다.
정리하면 다음과 같습니다.
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
#if Dev
print("현재 개발 타겟입니다.")
#else
print("현재 제품 타겟입니다.")
#endif
guard let _ = (scene as? UIWindowScene) else { return }
}
혹시 라이브러리를 설치하신다면, 새롭게 생성된 Target 에도 꼭 추가해주세요
(위치 : Project > Targets > 새로추가한타켓 > General > Frameworks, Libraries, and Embeded Content)
저는 SnapKit 을 추가했습니다.
그리고 프로젝트에 Swift파일을 추가하다보면, cannot find 에러가 발생할 수 있는데, 아래 글을 참조하시면 큰 도움이 되실겁니다.
https://www.zehye.kr/ios/2021/09/03/iOS_target_membership/