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  

Ответ 1

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

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

Build Settings tab of my project settings

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

#ifdef DEBUG

// Something to log your sensitive data here

#else

// 

#endif

Ответ 2

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

введите описание изображения здесь

Ответ 3

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

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

//put this in prefix.pch

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

Ответ 4

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

Мое мнение:

  • Изменить схему → запустить → построить конфигурацию: выберите debug/release. Он может управлять симулятором и вашим тестовым статусом кода iPhone.

  • Изменить схему → archive → build configuration: выберите debug/release. Он может контролировать приложение тестового пакета и статус кода приложения App Store. введите описание изображения здесь

Ответ 5

Ответ 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

Ответ 6

В xcode 7 есть поле под Apple LLVM 7.0 - препроцессинг, который называется "Макросы препроцессоров, не используемые в прекомпилированном..."? Я положил DEBUG перед Debug, и он работает для меня, используя следующий код:

#ifdef DEBUG
    NSString* const kURL = @"http://debug.com";
#else
    NSString* const kURL = @"http://release.com";
#endif

Ответ 7

Еще одна идея обнаружить:

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()

Не нужно писать что-то внутри свойств проекта быстрыми флагами.

Ответ 8

Xcode 10+

#if DEBUG перейдет в ЛЮБУЮ разработку/специальную сборку, устройство или симулятор. Это ложно только для релиза App Store.

Пример:

#if DEBUG
   print("Not App Store build")
#else
   print("App Store build")
#endif

Ответ 9

Не уверен, ответил ли я на ваш вопрос, возможно, вы могли бы попробовать этот код:

#ifdef DEBUG
#define DLOG(xx, ...)  NSLog( \
    @"%s(%d): " \
    xx, __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__ \  
    )
#else
#define DLOG(xx, ...)  ((void)0)
#endif