Xcode / iOS: Как определить, выполняется ли код в сборке DEBUG / RELEASE?
Я делаю приложение, которое обрабатывает конфиденциальные данные кредитной карты.
Если мой код работает в режиме отладки я хочу, чтобы это записать данные в консоль и сделать некоторые дампы.
однако в окончательной версии appstore (т. е. когда он работает в режиме выпуска) важно, чтобы все это было отключено (угроза безопасности)!
Я постараюсь ответить на мой вопрос как можно лучше; так что вопрос становится 'это решение путь правильный или лучший способ сделать это?-
// add `IS_DEBUG=1` to your debug build preprocessor settings
#if( IS_DEBUG )
#define MYLog(args...) NSLog(args)
#else
#define MYLog(args...)
#endif
8 ответов:
проверьте настройки сборки вашего проекта в разделе "Apple LVM-Preprocessing", "макросы препроцессора" для отладки, чтобы убедиться, что "DEBUG" устанавливается - сделайте это, выбрав проект и нажав на вкладку настройки сборки. Найдите "DEBUG" и посмотрите, действительно ли устанавливается DEBUG.
обратите внимание, хотя. Вы можете увидеть отладку, измененную на другое имя переменной, такое как DEBUG_MODE.
затем условно код для отладки в исходном файлы
#ifdef DEBUG // Something to log your sensitive data here #else // #endif
для решения в Swift, пожалуйста, обратитесь к этой теме так.
в основном решение в Swift будет выглядеть так:
#if DEBUG println("I'm running in DEBUG mode") #else println("I'm running in a non-DEBUG mode") #endif
дополнительно вам нужно будет установить
DEBUG
символ на через-D DEBUG
запись. См. следующий скриншот для примера:
Apple уже включает в себя
DEBUG
флаг в отладочных сборках, поэтому вам не нужно определять свой собственный.вы также можете рассмотреть возможность просто переопределения
NSLog
к нулевой операции, когда не вDEBUG
режим, таким образом, ваш код будет более компактен и вы можете просто использовать регулярныеNSLog
отчетность://put this in prefix.pch #ifndef DEBUG #undef NSLog #define NSLog(args, ...) #endif
большинство ответов сказали, что как установить #ifdef DEBUG и ни один из них не говорит, как определить debug/release build.
мое мнение:
Edit scheme - > run - > build configuration: выберите debug / release . Он может управлять симулятором и состоянием кода вашего тестового iPhone.
Edit scheme - > archive - > build configuration: выберите debug / release . Он может управлять приложением тестового пакета и кодом приложения 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 перед Debug и это работает для меня, используя ниже код:
#ifdef DEBUG NSString* const kURL = @"http://debug.com"; #else NSString* const kURL = @"http://release.com"; #endif
Не уверен, что я ответил вам на вопрос, может быть, вы могли бы попробовать этот код:
#ifdef DEBUG #define DLOG(xx, ...) NSLog( \ @"%s(%d): " \ xx, __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__ \ ) #else #define DLOG(xx, ...) ((void)0) #endif
еще одна идея для обнаружения:
DebugMode.h
#import <Foundation/Foundation.h> @interface DebugMode: NSObject +(BOOL) isDebug; @end
DebugMode.м
#import "DebugMode.h" @implementation DebugMode +(BOOL) isDebug { #ifdef DEBUG return true; #else return false; #endif } @end
добавить в файл моста заголовка:
#include "DebugMode.h"
использование:
DebugMode.isDebug()
не нужно писать что-то внутри свойств проекта swift флаги.