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