Swift : API 키를 구현하기 위해 PREPROCESSOR 플래그 (`#if DEBUG`와 같은)를 사용하는 방법은 무엇입니까?


95

에서 Objective-C가 (MixPanel, 질풍 또는 Crashlytics 같은 분석 패키지 RELEASE 및 DEBUG 키를 구분하기 위해, 예를 들어) 다른 API 키를 정의하는 정적 문자열 상수를 사용하는 것이 유용했다 :

#if DEBUG
static NSString *const API_KEY = @"KEY_A";
#else
static NSString *const API_KEY = @"KEY_B";
#endif

그리고...

[Analytics startSession:API_KEY];

Swift 컴파일러가 더 이상 전처리기를 사용하지 않기 때문에 이것이 Swift로 어떻게 변환됩니까?

답변:


161

Apple은 Xcode 8 부터 Swift 전 처리기 플래그를 완벽하게 지원 하므로 더 이상 "Other Swift Flags"에서 이러한 값을 설정할 필요가 없습니다.

새로운 설정은 "Active Compilation Conditions"라고 불리며, 전 처리기 플래그에 해당하는 Swift에 대한 최상위 지원을 제공합니다. 값 앞에 "-D"를 붙일 필요가 없다는 점을 제외하고는 "Other Swift Flags"와 똑같은 방식으로 사용합니다 (조금 더 깔끔함).

로부터 엑스 코드 8 릴리스 노트 :

Active Compilation Conditions조건부 컴파일 플래그를 Swift 컴파일러에 전달하기위한 새로운 빌드 설정입니다. 이 설정 값의 각 요소 는 동일한 접두사를 가진 clang -Preprocessor Macros전달 되는 요소와 동일한 방식 으로 D가 접두사로 붙은 swiftc 로 전달됩니다. (22457329)

여기에 이미지 설명 입력

위의 설정을 다음과 같이 사용합니다.

#if DEBUG
    let accessToken = "DebugAccessToken"
#else
    let accessToken = "ProductionAccessToken"
#endif

2
참고 : 당신이해야 하지 = 1 또는 기타 = 값을 지정합니다. 대신 플래그 이름 만 지정하면됩니다. :]
JRG-Developer

@ JRG-Developer 동의하지 않지만 여기에 귀하의 의견이 어떻게 적용되는지 잘 모르겠습니다.
Dan Loewenherz

9
이것은 유용한 답변이지만 Objective-C 배경에서 나온 것입니다 (많은 iOS 개발자가 있다고 생각하는 것처럼), 지정해야한다고 가정 =1했습니다. 내가했을 때. 그래서 저는 다음 동료를 돕기 위해이 정보를 공유 할 것이라고 생각했습니다. :] 어쨌든, 여기에 귀하의 답변에 감사드립니다!
JRG-Developer

1
@ JRG- 개발자, @Dan Loewenherz 나는 DEBUGin Active Compilation ConditionsDEBUG=1in을 둘 다 설정했는데이 Preprocessor Macros구성은 전혀 작동하지 않습니다. 제거해야합니까 DEBUG=1?? 위의 의견에서 명확하지 않습니다.
Bhavin_m apr

2
@DanLoewenherz 당신이 절대적으로 옳습니다. 내 대상 설정에서 아카이브 구성에 대해 "DEBUG"를 설정 했으므로 디버그 문을 실행할 때마다 릴리스 조건을 실행하지 않습니다. 문제에 직면 한 사람은 Build Configuration먼저 대상을 확인하십시오 . 자세한 내용은이 답변 stackoverflow.com/questions/9063100/… 을 확인하십시오 .
Bhavin_m apr

131

업데이트 : Xcode 8은 이제이를 자동으로 지원합니다. 위의 @DanLoewenherz의 응답을 참조하십시오.

Xcode 8 이전에는 동일한 방식으로 매크로를 사용할 수있었습니다.

#if DEBUG
let apiKey = "KEY_A"
#else
let apiKey = "KEY_B"
#endif

그러나 Swift가 그것들을 선택하기 위해서는 타겟의 Build Settings에서 "Other Swift Flags"를 설정해야합니다 :

  • 대상에 대한 빌드 설정 열기
  • "other swift flags"검색
  • -D플래그 앞에 사용하려는 매크로를 추가하십시오.

여기에 이미지 설명 입력


당신은 내 하루를 만들었습니다! 나를 위해 그것은 -D접두어 없이 작동하지 않았습니다
nomnom

5

후속 관찰로 api 키 / 비밀을 저장소에 일반 텍스트로 보관하지 마십시오. 비밀 관리 시스템을 사용하여 사용자의 환경 변수에 키 / 비밀을로드합니다. 그렇지 않으면 허용되는 경우 1 단계가 필요합니다.

  1. 둘러싸는 저장소 위의 일반 텍스트 파일에 "비밀"을 넣으십시오.
  2. (평가를 방지하려면 작은 따옴표를 사용 ../set_keys.sh하십시오) 목록을 포함하는 만들기export API_KEY_A='<plaintext_key_aef94c5l6>'
  3. source ../set_keys.sh실행 순서의 맨 위로 이동할 수있는 실행 스크립트 단계를 추가하십시오.
  4. 빌드 설정> 전 처리기 매크로에서 필요에 따라 다음과 같은 정의를 추가합니다. API_KEY_A="$API_KEY_A"

그러면 나중에 각 소스 파일에 대한 각 clang 호출에서 사용되는 컴파일러 정의에 환경 변수를 캡처합니다.

디렉토리 구조의 예

[10:33:15] ~/code/memo yes? tree -L 2 .
.
├── Memo
│   ├── Memo
│   ├── Memo.xcodeproj
│   ├── Memo.xcworkspace
│   ├── Podfile
│   ├── Podfile.lock
│   └── Pods
└── keys

0

신속한 패키지에서는 파일 의 swiftSettings인수 내에서이 작업을 수행 .target해야 Package.swift합니다. 사용 define방법 (애플 문서) 또는 스위프트 문서를

targets: [
.target(name: String,
            dependencies: [Target.Dependency],
            path: String?,
            exclude: [String]?,
            sources: [String]?,,
            cSettings: [CSetting]?,
            cxxSettings: [CXXSetting]?,
            swiftSettings: [SwiftSetting]?,
            linkerSettings: [LinkerSetting]?),

내 것이 이렇게 보이고 작동합니다!

            swiftSettings: [
               .define("VAPOR")
            ]

내 코드에서 다음을 사용하여 조건부로 컴파일 할 수 있습니다.

#if VAPOR
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.