Xcode / iOS: ¿Cómo determinar si el código se está ejecutando en la comstackción DEBUG / RELEASE?

Estoy creando una aplicación que procesa datos confidenciales de tarjetas de crédito.

Si mi código se ejecuta en modo de depuración, quiero registrar estos datos en la consola y realizar algunos volcados de archivos.

Sin embargo, en la versión final de la tienda de aplicaciones (es decir, cuando se ejecuta en modo de lanzamiento) es esencial que todo esto esté desactivado (peligro de seguridad).

Trataré de responder mi pregunta lo mejor que pueda; entonces la pregunta es ‘¿Es esta la solución la mejor o la mejor manera de hacerlo?’

// add `IS_DEBUG=1` to your debug build preprocessor settings #if( IS_DEBUG ) #define MYLog(args...) NSLog(args) #else #define MYLog(args...) #endif 

Verifique la configuración de comstackción de su proyecto en ‘Apple LVM – Preprocesamiento’, ‘Macros de preprocesador’ para la depuración para asegurarse de que ‘DEBUG’ se está configurando, haga esto seleccionando el proyecto y haciendo clic en la pestaña de configuración de comstackción. Busca ‘DEBUG’ y mira para ver si de hecho se está configurando DEBUG.

Presta atención sin embargo. Es posible que vea DEBUG cambiado a otro nombre de variable como DEBUG_MODE.

Pestaña Configuración de compilación de la configuración de mi proyecto

luego codifique condicionalmente DEPURACIÓN en sus archivos fuente

 #ifdef DEBUG // Something to log your sensitive data here #else // #endif 

Para una solución en Swift, consulte este hilo en SO.

Básicamente, la solución en Swift se vería así:

 #if DEBUG println("I'm running in DEBUG mode") #else println("I'm running in a non-DEBUG mode") #endif 

Además, deberá establecer el símbolo DEBUG en Swift Compiler - Custom Flags para la tecla Other Swift Flags través de una entrada -D DEBUG . Vea la siguiente captura de pantalla para un ejemplo:

enter image description here

Apple ya incluye un indicador DEBUG en las comstackciones de depuración, por lo que no necesita definir el suyo propio.

También es posible que desee considerar la redefinición de NSLog a una operación nula cuando no esté en el modo DEBUG , de ese modo su código será más portátil y podrá usar declaraciones regulares de NSLog :

 //put this in prefix.pch #ifndef DEBUG #undef NSLog #define NSLog(args, ...) #endif 

La mayoría de las respuestas indicaron cómo configurar #ifdef DEBUG y ninguna de ellas indicaba cómo determinar la comstackción de depuración / liberación.

Mi opinión:

  1. Editar esquema -> ejecutar -> configuración de comstackción: elegir depurar / liberar. Puede controlar el simulador y el estado del código de su iPhone de prueba.

  2. Editar esquema -> archivo -> configuración de comstackción: elegir depurar / liberar. Puede controlar la aplicación del paquete de prueba y el estado del código de la aplicación App Store. enter image description here

La respuesta de zitao xiong es bastante similar a la que uso; También incluyo el nombre del archivo (eliminando la ruta de ARCHIVO ).

 #ifdef DEBUG #define NSLogDebug(format, ...) \ NSLog(@"<%s:%d> %s, " format, \ strrchr("/" __FILE__, '/') + 1, __LINE__, __PRETTY_FUNCTION__, ## __VA_ARGS__) #else #define NSLogDebug(format, ...) #endif 

En xcode 7, hay un campo bajo Apple LLVM 7.0 – preprocesamiento , que llamó ” Macros de preprocesadores no usados ​​en precomstackdos … ” Puse DEBUG delante de Debug y funciona para mí usando el siguiente código:

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

No estoy seguro de haber respondido tu pregunta, tal vez podrías probar estos códigos:

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

Solo una idea más para detectar:

DebugMode.h

 #import  @interface DebugMode: NSObject +(BOOL) isDebug; @end 

DebugMode.m

 #import "DebugMode.h" @implementation DebugMode +(BOOL) isDebug { #ifdef DEBUG return true; #else return false; #endif } @end 

agregar en el archivo de puente del encabezado:

#include "DebugMode.h"

uso:

DebugMode.isDebug()

No es necesario escribir algo dentro de las banderas rápidas de las propiedades del proyecto.