IT story

Xcode / iOS : DEBUG / RELEASE 빌드에서 코드가 실행 중인지 확인하는 방법은 무엇입니까?

hot-time 2020. 4. 20. 20:31
반응형

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 LVM-전처리', '전 처리기 매크로'에서 프로젝트의 빌드 설정을 확인하여 '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 앱의 코드 상태를 제어 할 수 있습니다.여기에 이미지 설명을 입력하십시오


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

감지 할 아이디어가 하나 더 있습니다.

DebugMode.h

#import <Foundation/Foundation.h>

@interface DebugMode: NSObject
    +(BOOL) isDebug;
@end

DebugMode.m

#import "DebugMode.h"

@implementation DebugMode
+(BOOL) isDebug {
#ifdef DEBUG
    return true;
#else
    return false;
#endif
}
@end

헤더 브릿지 파일에 추가하십시오.

#include "DebugMode.h"

용법:

DebugMode.isDebug()

프로젝트 속성 swift 플래그 안에 무언가를 쓸 필요는 없습니다.


Xcode 10 이상

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

예:

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

내가 당신에게 질문에 대답했는지 확실하지 않으면, 당신은 아마도이 코드를 시도 할 수 있습니다 :

#ifdef DEBUG
#define DLOG(xx, ...)  NSLog( \
    @"%s(%d): " \
    xx, __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__ \  
    )
#else
#define DLOG(xx, ...)  ((void)0)
#endif 

참고 : https://stackoverflow.com/questions/9063100/xcode-ios-how-to-determine-whether-code-is-running-in-debug-release-build

반응형