Xcode/ iOS: Comment déterminer si le code est en cours d'exécution dans DEBUG / RELEASE build?

je fais une application qui traite les données sensibles de carte de crédit.

si mon code est en mode déboguage, je veux enregistrer ces données sur la console et faire quelques dumps.

cependant sur la version finale d'appstore (c'est-à-dire quand elle est en mode release), il est essentiel que tout cela soit désactivé (risque de sécurité)!

je vais essayer de répondre à ma question du mieux que je peux; donc la question devient ' est-ce solution path la bonne ou la meilleure façon de le faire?"

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

#if( IS_DEBUG )  
#define MYLog(args...) NSLog(args)  
#else  
#define MYLog(args...)  
#endif  
196
demandé sur P i 2012-01-30 15:26:26

8 réponses

vérifiez les paramètres de construction de votre projet sous 'Apple LVM - Preprocessing', 'Preprocessor Macros' pour debug pour vous assurer que 'DEBUG' est défini - faites ceci en sélectionnant le projet et en cliquant sur l'onglet 'build settings'. Cherchez 'DEBUG' et regardez pour voir si en effet DEBUG est mis.

faites attention. Vous pouvez voir DEBUG changé en un autre nom de variable tel que DEBUG_MODE.

Build Settings tab of my project settings

puis code conditionnel pour déboguer dans vos fichiers source

#ifdef DEBUG

// Something to log your sensitive data here

#else

// 

#endif
225
répondu Damo 2015-05-01 18:31:54

pour une solution dans Swift, veuillez vous référer à ce fil sur SO.

fondamentalement, la solution dans Swift ressemblerait à ceci:

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

de plus, vous devrez placer le symbole DEBUG dans la section Swift Compiler - Custom Flags pour la touche Other Swift Flags via une entrée -D DEBUG . Voir la capture d'écran suivante pour un exemple:

enter image description here

91
répondu Dschee 2017-05-23 10:31:30

Apple inclut déjà un drapeau DEBUG dans les constructions de débogage, donc vous n'avez pas besoin de définir le vôtre.

vous pourriez également envisager de simplement redéfinir NSLog à une opération nulle lorsqu'il n'est pas en mode DEBUG , de cette façon votre code sera plus portable et vous pouvez simplement utiliser les instructions NSLog régulières:

//put this in prefix.pch

#ifndef DEBUG
#undef NSLog
#define NSLog(args, ...)
#endif
86
répondu Nick Lockwood 2015-08-03 09:15:27

la plupart des réponses indiquent que comment définir #ifdef DEBUG et aucun d'entre eux ne dit Comment déterminer debug/release build.

mon avis:

  1. Modifier le schéma -> exécuter -> configuration de build :choisissez debug / release . Il peut contrôler le simulateur et l'état du code de votre iPhone de test.

  2. modifier le schéma -> archive -> construire la configuration :choisissez debug / release . Il peut contrôler le paquet de test app et app Store le code de statut. enter image description here

21
répondu Qun Li 2016-08-17 03:44:50

la réponse de Zitao xiong est assez proche de ce que j'utilise; j'inclus aussi le nom du fichier (en enlevant le chemin de fichier ).

#ifdef DEBUG
    #define NSLogDebug(format, ...) \
    NSLog(@"<%s:%d> %s, " format, \
    strrchr("/" __FILE__, '/') + 1, __LINE__, __PRETTY_FUNCTION__, ## __VA_ARGS__)
#else
    #define NSLogDebug(format, ...)
#endif
8
répondu geowar 2012-01-30 21:40:10

dans le xcode 7, Il y a un champ sous Apple LLVM 7.0 - prétraitement , qui a appelé " préprocesseurs Macros non utilisés dans précompilé... " J'ai mis DEBUG devant Debug et cela fonctionne pour moi en utilisant le code ci-dessous:

#ifdef DEBUG
    NSString* const kURL = @"http://debug.com";
#else
    NSString* const kURL = @"http://release.com";
#endif
7
répondu Fa.Shapouri 2016-02-21 07:31:51

pas sûr si je vous ai répondu question, peut-être que vous pourriez essayer ces codes:

#ifdef DEBUG
#define DLOG(xx, ...)  NSLog( \
    @"%s(%d): " \
    xx, __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__ \  
    )
#else
#define DLOG(xx, ...)  ((void)0)
#endif 
2
répondu Zitao Xiong 2012-01-30 12:21:41

juste une idée de plus à détecter:

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

ajouter dans le fichier d'en-tête de pont:

#include "DebugMode.h"

utilisation:

DebugMode.isDebug()

il n'est pas nécessaire d'écrire quelque chose à l'intérieur des drapeaux swift propriétés du projet.

1
répondu Vyacheslav 2017-01-28 23:15:32