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


241

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

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

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

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

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

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

답변:


248

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

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

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

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

#ifdef DEBUG

// Something to log your sensitive data here

#else

// 

#endif

귀하의 답변에 대한 감사합니다. 이렇게 만들려고하면 #ifdef DEBUG NSLog@("Something");#else//#endif작동하지 않습니다. 어떻게 버튼을 초기화하거나 콘솔에 무언가를 기록 할 수 있습니까? 질문을 편집 할 수 있습니까?
— Malloc

스위프트는 어때?
— technophyle

이 매크로를 런타임에 프로그래밍 방식으로 변경할 수 있습니까? 프로덕션 API로 전환하는 버튼을 활성화하고 싶습니다. 해당 버튼에서 DEBUG를 0으로 변경하고 사용자가 앱을 다시 시작해야한다는 메시지를 표시하고 싶습니다. 다음에는 프로덕션 API를 사용합니다.
— Hiren Prajapati

130

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

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


1
Swift Compiler-Custom Flags는 어디에 있습니까?
— confile

2
@confile : 찾을 위치를 명확히하는 스크린 샷을 첨부했습니다. 그것이 도움이되기를 바랍니다!
— Jeehut

1
이것을 사용하는 특정 프레임 워크 / 확장에 대해 정의해야합니다! 따라서 키보드 / 오늘 확장명이 있으면 거기에서 정의하십시오. 다른 종류의 프레임 워크가 동일한 경우. 이것은 주 목표가 객관적인 경우에만 필요할 수 있습니다.
— Warpzit

감사 보인다 Other Swift Flags당신이 선택하지 않으면 키가 나타나지 않습니다 All및 combined위
— 오스카 장

감사! 이것이 내가 놓친 것입니다. Clang으로 설정했지만 Swift는 설정하지 않았습니다.
— bugloaf

90

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

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

//put this in prefix.pch

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

33

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

내 의견 :

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

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


수상 답변 !!! 내 문제를 식별하는 데 도움이됩니다. 필자의 경우 Archive모드를 유지 Debug하고 앱을 앱 스토어에 제출했습니다. iTunes에서 앱을 다운로드 한 후 결과를 확인하면 작동하지 않습니다. DEBUG/RELEASE에서에서 해당 모드를 선택한 경우에만 작동 해야합니다 Build/Run/Archive.
— Bhavin_m

13

스위프트 및 Xcode 10+

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

예:

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

8

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

7

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

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

4

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

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 플래그 안에 무언가를 쓸 필요는 없습니다.


1

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

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

그 정의가 무엇을하고 있는지 정확히 설명해 주시겠습니까? 깔끔해 보이지만 잘 모르겠습니다. X는 일반적으로 Apple 예약 매크로를 나타내는 반면, PRETTY_FUNCTION은 사용자가 생성 한 것을 나타내므로 결과가 혼란스러워
— P i

2
xx는 형식 문자열이며 이전 문자열과 동일한 경우 원하는 것을 사용할 수 있습니다. FUNCTION 을 사용할 수 있지만 PRETTY_FUNCTION은 Objective-C 메소드 이름을 인쇄합니다. 이 링크는 그것을 잘 설명합니다.
— Zitao Xiong 2012
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.