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 196

8 ответов:

проверьте настройки сборки вашего проекта в разделе "Apple LVM-Preprocessing", "макросы препроцессора" для отладки, чтобы убедиться, что "DEBUG" устанавливается - сделайте это, выбрав проект и нажав на вкладку настройки сборки. Найдите "DEBUG" и посмотрите, действительно ли устанавливается DEBUG.

обратите внимание, хотя. Вы можете увидеть отладку, измененную на другое имя переменной, такое как DEBUG_MODE.

Build Settings tab of my project settings

затем условно код для отладки в исходном файлы

#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 запись. См. следующий скриншот для примера:

enter image description here

Apple уже включает в себя DEBUG флаг в отладочных сборках, поэтому вам не нужно определять свой собственный.

вы также можете рассмотреть возможность просто переопределения NSLog к нулевой операции, когда не в DEBUG режим, таким образом, ваш код будет более компактен и вы можете просто использовать регулярные NSLog отчетность:

//put this in prefix.pch

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

большинство ответов сказали, что как установить #ifdef DEBUG и ни один из них не говорит, как определить debug/release build.

мое мнение:

  1. Edit scheme - > run - > build configuration: выберите debug / release . Он может управлять симулятором и состоянием кода вашего тестового iPhone.

  2. Edit scheme - > archive - > build configuration: выберите debug / release . Он может управлять приложением тестового пакета и кодом приложения App Store статус. enter image description here

ответ 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 флаги.