2012-01-30 25 views
186

Estoy creando una aplicación que procesa datos confidenciales de tarjetas de crédito.Xcode/iOS: ¿Cómo determinar si el código se está ejecutando en la compilación DEBUG/RELEASE?

Si mi código se está ejecutando 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 está ejecutando en modo de lanzamiento) es esencial que todo esto esté desactivado (peligro de seguridad).

Intentaré responder a mi pregunta lo mejor que pueda; por lo que la pregunta se convierte en '¿Esta solución es la correcta 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 

Respuesta

218

Compruebe configuración de generación de su proyecto bajo 'de Apple LVM - Preprocesamiento', 'preprocesador de macros' para la depuración de asegúrese de que se está estableciendo 'DEBUG' - haga esto seleccionando el proyecto y haciendo clic en la pestaña de configuración de construcción. Busca 'DEBUG' y mira para ver si de hecho se está configurando DEBUG.

Sin embargo, preste atención. Es posible que vea DEBUG cambiado a otro nombre de variable como DEBUG_MODE.

Build Settings tab of my project settings

código a continuación, de forma condicional para la depuración en los archivos de origen

#ifdef DEBUG 

// Something to log your sensitive data here 

#else 

// 

#endif 
+0

Gracias por su respuesta, si intento hacer esto: '#ifdef DEBUG NSLog @ (" Something "); # else // # endif', esto no funciona. ¿Cómo puedo inicializar un botón o registrar algo en la consola? ¿Puedes editar tu pregunta? – Malloc

+2

Debería funcionar. ¿Por qué no publicar una nueva pregunta con algún código? – Damo

+1

Damo, gracias hombre, haciendo grandes cosas desde LPharma ;-) –

2

No estoy seguro si respondí usted pregunta, tal vez usted podría tratar estos códigos:

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

¿Podría explicar lo que está haciendo eso? Se ve limpio, pero no lo entiendo del todo. __X__ Normalmente indica una macro reservada de Apple, mientras que PRETTY_FUNCTION indica algo generado por el usuario, por lo que el resultado es confuso –

+2

xx es cadena de formato, puede usar lo que desee, si es idéntico a la cadena anterior. Puede usar __FUNCTION__, pero PRETTY_FUNCTION imprime nombres de método Objective-C. este [enlace] (http://stackoverflow.com/questions/300673/is-it-true-that-should-not-use-nslog-on-production-code) lo explica muy bien. –

85

Apple ya incluye una bandera DEBUG en versiones de depuración, por lo que no es necesario definir el suyo propio.

También puede ser que desee considerar simplemente redefiniendo NSLog a una operación nula cuando no está en DEBUG modo, de esa manera su código será más portátil y sólo se puede utilizar NSLog declaraciones regulares:

//put this in prefix.pch 

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

zitao de Xiong respuesta está muy cerca de lo que uso; También incluyo el nombre del archivo (quitando la ruta del ARCHIVO).

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

Para una solución en Swift consulte this thread el 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 se tendrá que establecer el símbolo DEBUG en Swift Compiler - Custom Flags sección de la clave Other Swift Flags a través de una entrada -D DEBUG. Ver la siguiente captura de pantalla para ver un ejemplo:

enter image description here

+2

Gracias funcionó para mí, me faltaba "-D DEBUG" :) – Nitesh

+1

¿Dónde encuentro Swift Compiler - Custom Flags? – confile

+2

@confile: He adjuntado una captura de pantalla que debe dejar claro dónde encontrarla. ¡Espero eso ayude! – Dschee

6

en Xcode 7, hay un campo bajo de Apple LLVM 7.0 - preprocesamiento, que llamó "Preprocesadores macros no se utiliza en Precompiled ... " puse DEBUG delante de depuración y funciona para mí por mediante el siguiente código:

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

mayoría de las respuestas dijeron que la forma de depuración SET #ifdef y ninguno de ellos diciendo cómo determinadas depuración/liberar la acumulación

Mi opinión:.

  1. esquema Editar -> ejecutar -> construir configuración:. elegir depuración/liberarlo puede controlar el simulador y el estado del código de su iPhone de prueba.

  2. Editar esquema -> archivo -> configuración de compilació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

+0

¡Gracias! Eso es EXACTAMENTE por qué busqué aquí. Busqué en Google "¿cómo puedo probar la versión de lanzamiento de mi aplicación en poco tiempo?" – Neo42

1

Sólo una idea más para detectar: ​​

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 

anuncio d en el archivo de cabecera de puente:

#include "DebugMode.h"

uso:

DebugMode.isDebug()

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

Cuestiones relacionadas