[ios] Xcode / iOS : DEBUG / RELEASE 빌드에서 코드가 실행 중인지 확인하는 방법

민감한 신용 카드 데이터를 처리하는 앱을 만들고 있습니다.

내 코드가 디버그 모드에서 실행중인 경우이 데이터를 콘솔에 기록하고 파일 덤프를 만들고 싶습니다.

그러나 최종 앱 스토어 버전 (즉, 릴리스 모드에서 실행중인 경우)에서는이 기능을 모두 비활성화해야합니다 (보안 위험)!

나는 최선을 다해 나의 질문에 대답하려고 노력할 것이다. 문제는 ‘이 솔루션 경로가 올바른 또는 최선의 방법입니까?’입니다.

// add `IS_DEBUG=1` to your debug build preprocessor settings  

#if( IS_DEBUG )  
#define MYLog(args...) NSLog(args)
#else
#define MYLog(args...)
#endif  



답변

디버그를 위해 ‘Apple LLVM-전처리’, ‘전 처리기 매크로’에서 프로젝트의 빌드 설정을 확인하여 디버그 중인지 확인 DEBUG하십시오. 프로젝트를 선택하고 빌드 설정 탭을 클릭하여이를 수행하십시오. 검색 DEBUG실제로 있는지 살펴 DEBUG세트되고있다.

그래도주의하십시오. DEBUG가 DEBUG_MODE와 같은 다른 변수 이름으로 변경된 것을 볼 수 있습니다.

내 프로젝트 설정의 빌드 설정 탭

그런 다음 소스 파일에서 조건부로 DEBUG를 코딩합니다.

#ifdef DEBUG

// Something to log your sensitive data here

#else

// 

#endif


답변

Swift의 솔루션에 대해서는 SO 의이 스레드 를 참조하십시오 .

기본적으로 Swift솔루션 은 다음과 같습니다.

#if DEBUG
    println("I'm running in DEBUG mode")
#else
    println("I'm running in a non-DEBUG mode")
#endif

또한 항목을 통해 키의 섹션 에서 DEBUG기호 를 설정해야합니다 . 예제는 다음 스크린 샷을 참조하십시오.Swift Compiler - Custom FlagsOther Swift Flags-D DEBUG

여기에 이미지 설명을 입력하십시오


답변

Apple은 이미 DEBUG디버그 빌드에 플래그를 포함하고 있으므로 자신 만의 플래그를 정의 할 필요가 없습니다.

모드에 NSLog있지 않을 때 null 연산으로 재정의 하는 것을 고려할 수도 있습니다. 이렇게하면 DEBUG코드가 더 이식성이 좋으며 일반 NSLog명령문을 사용할 수 있습니다 .

//put this in prefix.pch

#ifndef DEBUG
#undef NSLog
#define NSLog(args, ...)
#endif


답변

대부분의 답변에 따르면 #ifdef DEBUG를 설정하는 방법은 없으며 디버그 / 릴리스 빌드를 결정하는 방법은 없습니다.

내 의견 :

  1. 구성표 편집-> 실행-> 빌드 구성 : 디버그 / 릴리스를 선택하십시오. 시뮬레이터와 테스트 iPhone의 코드 상태를 제어 할 수 있습니다.

  2. 구성표 편집-> 아카이브-> 빌드 구성 : 디버그 / 릴리스를 선택하십시오. 테스트 패키지 앱과 App Store 앱의 코드 상태를 제어 할 수 있습니다.
    여기에 이미지 설명을 입력하십시오


답변

스위프트Xcode 10+

#if DEBUG모든 개발 / 애드혹 빌드, 장치 또는 시뮬레이터를 통과합니다. App Store 및 TestFlight 빌드의 경우에만 거짓입니다.

예:

#if DEBUG
   print("Not App Store build")
#else
   print("App Store build")
#endif


답변

zitao xiong의 대답은 내가 사용하는 것과 매우 가깝습니다. 또한 파일 이름을 포함시킵니다 ( FILE 의 경로를 제거하여 ).

#ifdef DEBUG
    #define NSLogDebug(format, ...) \
    NSLog(@"<%s:%d> %s, " format, \
    strrchr("/" __FILE__, '/') + 1, __LINE__, __PRETTY_FUNCTION__, ## __VA_ARGS__)
#else
    #define NSLogDebug(format, ...)
#endif


답변

xcode 7에는 Apple LLVM 7.0 아래에 ” 사전 처리 매크로가 사용되지 않는 사전 처리 매크로 … ” 라는 사전 처리 필드가 있습니까? DEBUG디버그 앞에 넣고 아래 코드를 사용하여 작동합니다.

#ifdef DEBUG
    NSString* const kURL = @"http://debug.com";
#else
    NSString* const kURL = @"http://release.com";
#endif