Xcode / iOS: come determinare se il codice è in esecuzione nella build DEBUG / RELEASE?


241

Sto realizzando un'app che elabora i dati sensibili delle carte di credito.

Se il mio codice è in esecuzione in modalità debug, voglio registrare questi dati sulla console ed eseguire alcuni dump di file.

Tuttavia, nella versione finale dell'app store (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 "Questo percorso di 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  

Risposte:


248

Controlla le impostazioni di compilazione del tuo progetto in "Apple LLVM - Preelaborazione", "Macro del preprocessore" per il debug per accertarti che DEBUGsia impostato; fai questo selezionando il progetto e facendo clic sulla scheda delle impostazioni di compilazione. Cerca DEBUGe cerca di vedere se effettivamente DEBUGè stato impostato.

Presta attenzione però. È possibile che DEBUG sia cambiato in un altro nome di variabile come DEBUG_MODE.

Scheda Impostazioni build delle impostazioni del mio progetto

quindi codificare condizionalmente DEBUG nei file sorgente

#ifdef DEBUG

// Something to log your sensitive data here

#else

// 

#endif

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

Che dire di Swift?
tecnophyle

posso modificare questa macro programmaticamente in fase di esecuzione? Voglio abilitare un pulsante che passa alle API di produzione. Su quel pulsante, voglio cambiare DEBUG su 0 e visualizzare il messaggio di cui l'utente ha bisogno per riavviare l'app. Quindi la prossima volta utilizzerà le API di produzione.
Hiren Prajapati,

130

Per una soluzione in Swift, fare riferimento a questa discussione su SO.

Fondamentalmente la soluzione in 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 dovrai impostare il DEBUGsimbolo nella Swift Compiler - Custom Flagssezione per la Other Swift Flagschiave tramite una -D DEBUGvoce. Vedi il seguente screenshot per un esempio:

inserisci qui la descrizione dell'immagine


1
Dove trovo Swift Compiler - Bandiere personalizzate?
confila il

2
@confile: ho allegato uno screenshot che dovrebbe chiarire dove trovare. Spero che sia d'aiuto!
Jeehut,

1
Ricorda che questo deve essere definito per il framework / estensione specifici che lo usano! Quindi se hai un'estensione tastiera / oggi definiscilo lì. Se hai qualche altro tipo di framework stessa cosa. Ciò potrebbe essere necessario solo se l'obiettivo principale è l'obiettivo c ...
Warpzit,

grazie, sembra che la Other Swift Flagschiave non apparirà se non si seleziona Alle combinedsopra
Oscar Zhang

Grazie! Questo è quello che mi mancava. L'avevo impostato per Clang ma non per Swift.
bugloaf

90

Apple include già un DEBUGflag nelle build di debug, quindi non è necessario definire il proprio.

Potresti anche considerare di ridefinire NSLogun'operazione null quando non è in DEBUGmodalità, in questo modo il tuo codice sarà più portabile e puoi semplicemente usare le NSLogistruzioni regolari :

//put this in prefix.pch

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

33

La maggior parte delle risposte ha detto che come impostare #ifdef DEBUG e nessuno di loro ha detto come determinare la build di debug / release.

La mia opinione:

  1. Modifica schema -> esegui -> crea configurazione: scegli debug / release. Può controllare il simulatore e testare lo stato del codice dell'iPhone.

  2. Modifica schema -> archivio -> build configurazione: scegli debug / release. Può controllare l'app del pacchetto di test e lo stato del codice dell'app App Store. inserisci qui la descrizione dell'immagine


Risposta premiata !!! mi aiuta a identificare il mio problema. Nel mio caso, avevo mantenuto la Archivemodalità Debuge inviato l'app all'App Store. Quando si controlla il risultato dopo il download dell'app da iTunes, semplicemente non funziona. Quindi assicurati che funzioni DEBUG/RELEASEsolo quando è selezionata la rispettiva modalità in Build/Run/Archive.
Bhavin_m,

13

Swift e Xcode 10+

#if DEBUGpasserà in QUALSIASI sviluppo, dispositivo o simulatore di sviluppo / ad-hoc. È falso solo per build App Store e TestFlight.

Esempio:

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

8

La risposta di zitao xiong è abbastanza vicina a ciò che uso; Includo anche il nome del file (rimuovendo 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

7

In xcode 7, c'è un campo in Apple LLVM 7.0 - preelaborazione , che si chiama " Macro dei preprocessori non utilizzati in precompilati ... "? Ho messo DEBUG davanti a Debug e funziona per me usando il codice seguente:

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

4

Ancora un'altra idea per 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

aggiungi nel file bridge dell'intestazione:

#include "DebugMode.h"

utilizzo:

DebugMode.isDebug()

Non è necessario scrivere qualcosa all'interno delle proprietà del progetto flag rapidi.


1

Non sono sicuro se ho risposto alla tua domanda, forse potresti provare questo codice:

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

Potresti approfondire esattamente cosa sta facendo questa definizione? Sembra pulito, ma non capisco bene. X Di solito indica una macro riservata Apple, mentre PRETTY_FUNCTION indica qualcosa generato dall'utente, quindi il risultato è confuso
P

2
xx è una stringa di formato, puoi usare quello che vuoi, se è identico alla stringa precedente. È possibile utilizzare FUNCTION , ma PRETTY_FUNCTION stampa i nomi dei metodi Objective-C. questo link lo spiega molto bene.
Zitao Xiong,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.