코드가 DEBUG/릴리스 빌드에서 실행 중인지 여부를 확인하는 방법은 무엇입니까?
저는 민감한 신용카드 데이터를 처리하는 앱을 만들고 있습니다.
내 코드가 디버그 모드에서 실행 중이면 이 데이터를 콘솔에 기록하고 파일 덤프를 만들고 싶습니다.
그러나 최종 앱스토어 버전(즉, 릴리스 모드에서 실행 중인 경우)에서는 이 모든 것이 비활성화(보안 위험)되는 것이 필수적입니다!
저는 가능한 한 제 질문에 답하려고 노력할 것입니다. 따라서 질문은 '이 솔루션 경로가 이를 위한 올바른 방법인가 아니면 최선의 방법인가?'가 됩니다.
// 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 - 전처리', 'Preprocessor Macros'에서 프로젝트 빌드 설정을 확인합니다.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
a를 통한 키-D DEBUG
다음 스크린샷의 예를 참조하십시오.
Apple은 이미 다음을 포함합니다.DEBUG
디버그 빌드의 플래그를 사용하여 사용자가 직접 정의할 필요가 없습니다.
당신은 또한 단지 정의를 재정의하는 것을 고려하는 것이 좋을 것입니다.NSLog
에 없을 때 null 연산으로DEBUG
모드, 그렇게 하면 코드가 더 휴대하기 쉽고 그냥 일반적으로 사용할 수 있습니다.NSLog
문:
//put this in prefix.pch
#ifndef DEBUG
#undef NSLog
#define NSLog(args, ...)
#endif
대부분의 답변은 #ifdef DEBUG를 설정하는 방법에 대해 답했지만 디버그/릴리스 빌드를 결정하는 방법에 대해서는 언급하지 않았습니다.
내 의견:
구성표 편집 -> 실행 -> 빌드 구성 : debug / release를 선택합니다.그것은 시뮬레이터와 테스트 아이폰의 코드 상태를 제어할 수 있습니다.
구성표 편집 -> 보관 -> 빌드 구성 : 디버그 / 릴리스를 선택합니다.테스트 패키지 앱과 앱스토어 앱의 코드 상태를 제어할 수 있습니다.
Swift 및 Xcode 10+
#if DEBUG
모든 개발/애드혹 빌드, 장치 또는 시뮬레이터를 통과합니다.앱스토어 및 TestFlight 빌드의 경우에만 잘못된 것입니다.
예:
#if DEBUG
print("Not App Store or TestFlight build")
#else
print("App Store or TestFlight build")
#endif
Kotlin 멀티플랫폼 ios 디버그 모드로 작업하는 사용자를 위해 이것을 추가합니다.빌드가 디버그인지 릴리스인지 확인할 수 있는 방법은 다음과 같습니다.
if (Platform.isDebugBinary) {
NSLog(message ?: "", "")
}
zitaoxiong의 답변은 제가 사용하는 것과 거의 비슷합니다. 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 앞에 DEBUG를 붙였는데 아래 코드를 사용하면 작동합니다.
#ifdef DEBUG
NSString* const kURL = @"http://debug.com";
#else
NSString* const kURL = @"http://release.com";
#endif
탐지할 아이디어가 하나 더 있습니다.
디버그 모드.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 14 업데이트...
Xcode 8부터는 "Other Swift Flags" 대신 "Active Compilation Conditions"를 사용해야 합니다.Xcode 9.3 기준으로 Apple은 이미 다음을 포함하고 있습니다.DEBUG
프로젝트에 가치: 다음과 같습니다.
즉, 프로젝트 설정을 변경할 필요가 없으며 사용할 수 있습니다.#if DEBUG
즉시:
#if DEBUG
print("something")
#endif
그래서 저는 제 릴리스 빌드에서 코드가 실행되지 않는 이유를 알아내려고 노력하던 중에 길을 찾았고, 다른 답은 #release가 작동하는 경우를 만드는 방법을 다루지 않았습니다.
저는 DEBUG 모드에서 아무 일도 일어나지 않기를 원했기 때문에 그냥 작동할 것이라고 가정하고 (잘못된) #if RELEASE를 사용했습니다.
#if RELEASE // 여기서 특정 릴리스를 수행합니다. #endif
(적어도 XCode 14 기준) Project -> Combined -> Swift Compiler - Custom Flags (아래 스크린샷 참조)로 이동할 수 있습니다.Release 섹션에 RELEASE 값을 추가하면 #if RELEASE가 위와 같이 작동합니다.
릴리스할 때 빈 공간 옆에 있는 +를 클릭하지 않고 빈 공간을 두 번 클릭합니다.그러면 "Any Architecture / Any SDK" 줄이 추가되어 RELEASE 플래그가 제대로 작동하지 않습니다.
올바른 버전:
잘못된 버전:
제가 질문에 대답했는지 잘 모르겠습니다. 다음 코드를 사용해 보십시오.
#ifdef DEBUG
#define DLOG(xx, ...) NSLog( \
@"%s(%d): " \
xx, __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__ \
)
#else
#define DLOG(xx, ...) ((void)0)
#endif
언급URL : https://stackoverflow.com/questions/9063100/how-to-determine-whether-code-is-running-in-debug-release-build
'programing' 카테고리의 다른 글
일부 문자열로 접히는 hrefend 선택 (0) | 2023.05.13 |
---|---|
Windows에서 지정된 문자열이 올바른 파일 이름인지 확인하는 방법은 무엇입니까? (0) | 2023.05.13 |
HTML 형식의 전자 메일을 보내는 방법은 무엇입니까? (0) | 2023.05.13 |
쿼리 키의 MongoDB 와일드카드 (0) | 2023.05.13 |
GitLab 토큰을 사용하여 인증 없이 복제 (0) | 2023.05.13 |