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
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.
puis code conditionnel pour déboguer dans vos fichiers source
#ifdef DEBUG
// Something to log your sensitive data here
#else
//
#endif
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:
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
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:
-
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.
-
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.
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
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
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
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.