안녕하세요!
주제가 이리저리 튀는 데브리프터입니다..
클라이언트에 따라서 모의해킹용으로 빌드를 하는데 이때마다 configuration이나
여러 가지 보안 세팅 코드들을 수정하고 다시 원래대로 돌려놓아야 하는
굉~~~~~~장히 번거롭고
그럼에도 휴먼에러 가능성이 너무 많은 상황이라 이를 조금이라도
자동으로 제어할 수 있게 하려고 찾아보다가 flag라는 아이를 처음으로 알게 됐습니다!
근데 이놈이.. 좀 헷갈리고 세팅하는 데서도 좀 애를 먹어서 (한 번만 테스트하고 문서화해놓으면 되는 건데 왜 아직..?)
다른 분들도 저처럼 고생하지 말고
이것도 되나..?
그럼 이런 케이스도..?
하는 부분까지 다 테스트 돌려보고 기록한 거 보시라고 작성했습니다!
.
.
그럼 시작하겠습니다!!
먼저 Swift 에는 #을 사용하여 전처리문을 작성하는 방법이 있다는 건 다들 알고 계실 겁니다!
보통은 아래와 같이 사용합니다.
#if DEBUG
print("DEBUG")
#else
print("RELEASE")
#endif
코드를 보면 #if 를 통해서 DEBUG 이냐 아니냐만 판단해주고 있습니다.
이렇게 컴파일 조건을 나누어서 Flag를 설정하는 방법은 두 가지가 있습니다.
- Active Compilations Conditions
- Other Swift flags
일반적으로 두 개 모두 flag(플래그)라고 부릅니다. 단, 몇 가지 차이점이 있습니다.
Active Compilations Conditions
목적 : 빌드 구성별 기본 컴파일 조건 설정
설정방법 : Build Setting에서 직접 입력
예시 : #if DEBUG, #if RELEASE
Other Swift flags
목적 : 사용자 정의 컴파일 플래그 추가
설정 방법 : -D접두사로 플래그 추가
예시 : #if NETWORKING_ENABLED, #if FEATURE_X
둘 다 build Setting에서 변경할 수 있습니다.
위 코드에서 잠깐 보면, 현재는
#if RELEASE라는 코드는 동작하지 않습니다.
왜 그런지 알아보겠습니다.
처음에 프로젝트를 생성하면 기본적으로 configuration 은 사진과 같은 Release, Debug 2가지가 생성됩니다.
( command + 1 > Project > info > configuration )
그래서 #if RELEASE를 해도 분기를 타지 않는 거죠!
그래서 이 RELEASE를 활성화하려면
아래 사진과 같이 Build Setting에서 Active Compliation Conditions를 생성해줘야 합니다.
이번에는 새로운 Configuration을 생성해서 새로운 Flag를 등록해 보겠습니다.
이렇게 하면 HACK Configuration을 세팅해서 특정 스킴을 세팅하거나 전처리문으로 제어가 가능합니다!
테스트를 위한 코드를 작성해 보겠습니다
func configTest() {
#if RELEASE
print(#function, "🚀🚀 RELEASE 🚀🚀")
#endif
#if HACK
print(#function, "🚀🚀 HACK 🚀🚀")
#endif
#if DEBUG
print(#function, "🚀🚀 DEBUG 🚀🚀")
#endif
}
왼쪽과 같이 스킴을 세팅해 줬고 각각 Release, Debug, Hack으로 build Configuration을 설정해 줬습니다
테스트는 주로 Debug와 Hack을 이용해서 여러 가지 케이스를 생성해 보겠습니다!!
Case 1
- Active Compil ation Conditions를 각각 세팅해 줬을 때
사진과 같이 각각의 flag 가 잘 작동하는 모습입니다.
Case 2
- 하나의 configuration에 두 개 이상의 flag를 등록했을 때
Hack이라는 Configuration에 HACK, MULTI라는 2개 이상의 flag를 넣어 보았습니다
그리고 전처리문을 추가했습니다
#if RELEASE
print(#function, "🚀🚀 RELEASE 🚀🚀")
#endif
#if HACK
print(#function, "🚀🚀 HACK 🚀🚀")
#endif
#if DEBUG
print(#function, "🚀🚀 DEBUG 🚀🚀")
#endif
#if MULTI
print(#function, "🚀🚀 MULTI 🚀🚀")
#endif
그 결과는??
.
.
.
두둥!!!
보시는 것과 같이 flag 모두 나오는 것을 알 수 있습니다!
Case 3
- 다른 configuration 이름으로 flag를 중복 등록했을 때
#if RELEASE
print(#function, "🚀🚀 RELEASE 🚀🚀")
#endif
#if HACK
print(#function, "🚀🚀 HACK 🚀🚀")
#endif
#if DEBUG
print(#function, "🚀🚀 DEBUG 🚀🚀")
#endif
위와 같이 설정하고 빌드 Configuration을 Hack으로 설정하고 실행하면
.
.
.
이렇게 DEBUG 분기만 타는 것을 알 수 있습니다!
즉 , Active Compilations Conditions는 다른 Build Configuration과 똑같이 해도 잘 작동한다!
또, 반드시 대문자로만 설정하지 않고 Debug 나 Hack이라고 설정해도 전처리문만 잘 작성해 주면 문제없이 동작합니다.
이번엔 Other Swift Flags로 컴파일 세부조건을 설정해 보겠습니다.
Project | target -> buildSetting -> Other Swift flags
테스트를 위한 코드를 작성해 보겠습니다
func flagTest() {
#if GLOBALFLAG1
print(#function, "🚩🚩 Global 1 🚩🚩")
#if HACKFLAG1
print(#function, "🚩🚩HACKFLAG1 🚩🚩")
#endif
#endif
#if HACKFLAG1
print(#function, "🚩🚩HACKFLAG1 🚩🚩")
#endif
#if DEBUGFLAG1
print(#function, "🚩🚩DEBUGFLAG1 🚩🚩")
#endif
#if DEBUGFLAG2
print(#function, "🚩🚩DEBUGFLAG2 🚩🚩")
#endif
}
다음과 같이 플래그를 설정했습니다.
- 동일한 flag를 모든 build config에 넣어도 잘 작동하는지,
- 커스텀 flag들이 2개 이상이어도 작동하는지, 각 분기마다 잘 타는지
- Active Compilations Conditions이나 Configuratio과 똑같은 이름을 넣어도 작동하는지
저는 테스트할 때 이렇게 3개의 궁금증이 생겼습니다.
Case 1
첫 번째로 동일한 flag를 모든 build config에 넣어도 잘 작동하는지 알아보기 위해서
-DGOBALFLAG1을 모두 넣어주고 각각 다른 Configuration에서 모두 출력이 되는지 알아봤습니다
.
.
결과는?
Debug ->
Hack ->
Release ->
Case 2
두 가지 이상 등록해도 모두 출력이 되는지
보시다시피 중복으로 등록한 GlobalFlag와 Debug에서만 등록한 DebugFlag 모두 잘 출력이 됩니다!
Case 3
Active 머시기에서 입력한 Flag와 똑같이 설정해도 (중복으로) 잘 작동이 되는지
이렇게 세팅하면 Debug, Hack 빌드일 때 모두
DEBUG, HACK 이 출력될 것이 예상됩니다.
.
.
그리고 결과는?
prjcect / target build setting 주의사항
마지막으로 build setting을 찾아갈 때, Project 단과 Target 단에서 찾아갈 수 있는데
저는 처음에 Project에서만 수정하고 나니 Target에서는 같은 내용이 반영이 안 돼서
코드가 작동이 제대로 되지 않아서 좀 헤맸습니다.
이 글을 보시는 분은 두 가지 모두에서 build Setting 이 잘 변경되었는지 확인해 보시길 바랍니다!!
여기까지 Flag를 사용하여 build 모드와 특별한 코드를 제어하는 방법에 대해서 알아봤습니다!
솔직히 옆 자리 개발자가 Flag 해봤는데 Xcode 에러니 iOS는 원래 그렇다느니 해서 ( 원래 Apple 안 좋아하는 분 )
된다는 거 증명하고 싶어서 테스트해봤는데 하다 보니 이런저런 궁금증이 많이 생겨서 여러 가지 케이스를 다 테스트해봤습니다!
결론은 에러 같은 건 없고, 세팅만 잘해준다면 문제없이 Flag를 통하여 특별한 상황에 따라 코드를 제어할 수 있다입니다!
혹시 제가 빠뜨렸는데 궁금하신 게 있으신 분은 언제든지 댓글 달아주세요!!
🙇♂️🙇♂️🙇♂️🙇♂️
감사합니다
🙇♂️🙇♂️🙇♂️🙇♂️
'Swift' 카테고리의 다른 글
[Swift/iOS] tagView, ChipView를 만들어보자! (0) | 2024.05.15 |
---|---|
[Swift / iOS ] 디자인 패턴 (MVVM, MVP, MVI에 대한 모든 것 ) - Hyeon's iOS 개발 (0) | 2023.12.14 |
[Swift] 고차함수 Flatmap, CompatMap, map 의 사용 (0) | 2023.11.21 |
[Swift] ClosedRange (1) | 2023.10.23 |
[Swift]iOS 17 업데이트로 인한 Apple의 URL Parsing 변경 이슈 (1) | 2023.10.06 |