2012-01-30 13 views
186

Sto creando un'app che elabora dati sensibili della carta di credito.Xcode/iOS: come determinare se il codice è in esecuzione in DEBUG/RELEASE?

Se il mio codice è in esecuzione in modalità di debug, desidero registrare questi dati sulla console e creare alcuni file dump.

Tuttavia, nella versione finale dell'appstore (ovvero quando è in esecuzione in modalità di rilascio) è essenziale che tutto ciò sia disabilitato (pericolo per la sicurezza)!

Cercherò di rispondere alla mia domanda nel miglior modo possibile; quindi la domanda diventa "Il percorso della soluzione è il modo giusto o migliore per farlo?"

// add `IS_DEBUG=1` to your debug build preprocessor settings 

#if(IS_DEBUG) 
#define MYLog(args...) NSLog(args) 
#else 
#define MYLog(args...) 
#endif 

risposta

218

Controllare impostazioni di generazione del vostro progetto sotto 'di Apple LVM - Pre-elaborazione', 'preprocessore macro' per il debug a assicurati che sia impostato "DEBUG" - fai questo selezionando il progetto e facendo clic sulla scheda delle impostazioni di compilazione. Cerca 'DEBUG' e cerca di vedere se DEBUG è stato impostato.

Attenzione però. È possibile visualizzare DEBUG modificato in un altro nome di variabile come DEBUG_MODE.

Build Settings tab of my project settings

codice poi condizionale per il debug nei file di origine

#ifdef DEBUG 

// Something to log your sensitive data here 

#else 

// 

#endif 
+0

Grazie per la tua risposta, se provo a fare così: '#ifdef DEBUG NSLog @ (" Qualcosa "); # else // # endif', questo non funziona. Come posso inizializzare un pulsante o registrare qualcosa sulla console per favore, puoi modificare la tua domanda? – Malloc

+2

Dovrebbe funzionare. Perché non pubblicare una nuova domanda con un po 'di codice? – Damo

+1

Damo, grazie amico, fa grandi cose da LPharma ;-) –

2

Non sono sicuro se ho risposto si mette in discussione, forse si potrebbe provare questi codice:

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

Potresti approfondire esattamente cosa sta facendo quella definizione? Sembra pulito, ma non lo capisco. __X__ In genere indica una macro riservata Apple, mentre PRETTY_FUNCTION indica qualcosa generato dall'utente, quindi il risultato è confuso. –

+2

xx è una stringa di formato, puoi usare quello che vuoi, se è identico alla stringa precedente. Puoi usare __FUNCTION__, ma PRETTY_FUNCTION stampa i nomi dei metodi Objective-C. questo [link] (http://stackoverflow.com/questions/300673/is-it-true-that-one-should-not-use-nslog-on-production-code) lo spiega molto bene. –

85

Apple include già una bandiera DEBUG in build di debug, quindi non c'è bisogno di definire il proprio.

Si potrebbe anche prendere in considerazione solo ridefinendo NSLog ad un'operazione di nulla quando non è in modalità DEBUG, in questo modo il vostro codice sarà più portatile e si può solo uso regolare NSLog dichiarazioni:

//put this in prefix.pch 

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

zitao risposta di Xiong è abbastanza vicino a quello che uso; Includo anche il nome del file (eliminando il percorso di FILE).

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

Per una soluzione a Swift si rimanda al this thread su SO.

In sostanza la soluzione a Swift sarebbe simile a questa:

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

Inoltre avrete bisogno per impostare il simbolo DEBUG in Swift Compiler - Custom Flags sezione per la chiave Other Swift Flags tramite una voce -D DEBUG. Vedere la schermata seguente per un esempio:

enter image description here

+2

Grazie ha funzionato per me, mi mancava "-D DEBUG" :) – Nitesh

+1

Dove trovo Swift Compiler - Custom Flags? – confile

+2

@confile: ho allegato uno screenshot che dovrebbe chiarire dove trovare. Spero che sia d'aiuto! – Dschee

6

in Xcode 7, v'è un campo sotto di Apple LLVM 7.0 - pre-elaborazione, che chiama "preprocessori macro non utilizzati in precompilato ... " ho messo DEBUG davanti Debug e funziona per me usando il codice qui sotto:

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

La maggior parte delle risposte ha detto che come impostare DEBUG #ifdef e nessuno di loro dire come a determinare il debug/rilasciare accumulo

Il mio parere:.

  1. schema Modifica -> Esegui -> costruire configurazione:. scegliere il debug/release E ' può controllare il simulatore e lo stato del codice del tuo iPhone di prova.

  2. Modifica schema -> archivio -> creazione configurazione: selezionare debug/rilascio. Può controllare l'app del pacchetto di test e lo stato del codice dell'app dell'app Store. enter image description here

+0

Grazie! Questo è ESATTAMENTE il motivo per cui ho navigato qui. Ho cercato su google "come faccio a testare la versione di rilascio della mia app in swift?" – Neo42

1

Solo un'altra idea di rilevare:

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 

annuncio d nel file di intestazione ponte:

#include "DebugMode.h"

utilizzo:

DebugMode.isDebug()

Non è necessario scrivere qualcosa dentro di proprietà del progetto bandiere veloci.

Problemi correlati