programing

Swift: '#if DEBUG'와 같은 PRECPURG 플래그를 사용하여 API 키를 구현하는 방법은 무엇입니까?

muds 2023. 5. 16. 23:11
반응형

Swift: '#if DEBUG'와 같은 PRECPURG 플래그를 사용하여 API 키를 구현하는 방법은 무엇입니까?

Objective-C정적 문자열 상수를 사용하여 대체 API 키를 정의하는 것이 종종 유용했습니다(예: MixPanel, Flurry 또는 Crashlytics와 같은 분석 패키지에 대한 RELEASE 키와 DEBUG 키를 구별하는 것).

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

그리고 나서...

[Analytics startSession:API_KEY];

스위프트 컴파일러가 더 이상 프리프로세서를 사용하지 않기 때문에 이것이 스위프트로 어떻게 변환됩니까?

Apple은 Xcode 8에서 Swift 전처리기 플래그를 완전히 지원하므로 더 이상 "기타 Swift 플래그"에서 이 값을 설정할 필요가 없습니다.

새 설정은 "활성 컴파일 조건"이라고 하며, 이는 사전 프로세서 플래그에 해당하는 Swift에 대한 최상위 수준의 지원을 제공합니다.값 앞에 "-D"를 추가할 필요가 없다는 점을 제외하고는 "기타 스위프트 플래그"와 동일한 방식으로 사용합니다.

Xcode 8 릴리스 정보:

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

여기에 이미지 설명 입력

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

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

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

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

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

그러나 Swift에서 이러한 플래그를 선택하려면 대상의 빌드 설정에서 "기타 Swift 플래그"를 설정해야 합니다.

  • 대상에 대한 빌드 설정 열기
  • "기타 빠른 플래그" 검색
  • 사용할 매크로를 다음에 추가합니다.-D깃발

여기에 이미지 설명 입력

빠른 패키지에서 당신은 이것을 내부에서 해야 합니다.swiftSettings에 대한 주장..target당신의Package.swift파일을 사용합니다.define방법(Apple 설명서) 또는 Swift 설명서

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

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

  1. "비밀"을 위의 일반 텍스트 파일에 동봉된 리포지토리에 넣습니다.
  2. 성을 합니다.../set_keys.sh에는 의목이포있다니의 있습니다.export API_KEY_A='<plaintext_key_aef94c5l6>'하기 위해 한를 사용합니다.
  3. 합니다.source ../set_keys.sh의 맨 합니다.
  4. [ Settings ] > [ Macros ] 에서합니다.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

언급URL : https://stackoverflow.com/questions/38813906/swift-how-to-use-preprocessor-flags-like-if-debug-to-implement-api-keys

반응형