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 Flags
Other 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를 설정하는 방법은 없으며 디버그 / 릴리스 빌드를 결정하는 방법은 없습니다.
내 의견 :
구성표 편집-> 실행-> 빌드 구성 : 디버그 / 릴리스를 선택하십시오. 시뮬레이터와 테스트 iPhone의 코드 상태를 제어 할 수 있습니다.
구성표 편집-> 아카이브-> 빌드 구성 : 디버그 / 릴리스를 선택하십시오. 테스트 패키지 앱과 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
'IT story' 카테고리의 다른 글
시작시 앱을 어떻게 시작합니까? (0) | 2020.04.20 |
---|---|
파이썬에서 UTF-8로 UTF-8 디코딩 (0) | 2020.04.20 |
HTML 이메일 렌더링 테스트 (0) | 2020.04.20 |
jQuery를 사용하여 요소의 제목 속성을 변경하는 방법 (0) | 2020.04.20 |
Python 3.0에서 generator.next ()가 표시됩니까? (0) | 2020.04.20 |