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당신이 선택하지 않으면 키가 나타나지 않습니다 Allcombined
오스카 장

감사! 이것이 내가 놓친 것입니다. 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.