web-dev-qa-db-fra.com

Xcode / iOS: Comment déterminer si le code est exécuté dans la compilation DEBUG / RELEASE?

Je crée une application qui traite des données sensibles de carte de crédit.

Si mon code est en cours d'exécution en mode débogage, je souhaite consigner ces données dans la console et effectuer des vidages de fichiers.

Cependant, dans la version finale de l’appstore (c’est-à-dire lorsqu’elle fonctionne 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; alors la question devient 'Ce chemin de solution est-il 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  
221
P i

Vérifiez les paramètres de construction de votre projet sous "Apple LVM - Prétraitement", "Macros de préprocesseur" pour le débogage afin de vous assurer que "DEBUG" est en cours de configuration. Pour ce faire, sélectionnez le projet et cliquez sur l'onglet Paramètres de construction. Recherchez 'DEBUG' et vérifiez si DEBUG est bien défini.

Faites attention cependant. DEBUG peut être remplacé par un autre nom de variable tel que DEBUG_MODE.

Build Settings tab of my project settings

puis conditionnez le code pour DEBUG dans vos fichiers source

#ifdef DEBUG

// Something to log your sensitive data here

#else

// 

#endif
241
Damo

Pour une solution dans Swift, veuillez vous reporter à ce fil sur SO.

En gros, 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 définir 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

108
Dschee

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

Vous pouvez également envisager de redéfinir NSLog en une opération null lorsque vous n'êtes pas en mode DEBUG. Ainsi, votre code sera plus portable et vous pourrez simplement utiliser les instructions NSLog classiques:

//put this in prefix.pch

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

La plupart des réponses ont indiqué comment définir #ifdef DEBUG et aucune d’entre elles ne dit comment déterminer la version de débogage/édition.

Mon avis:

  1. Edit scheme -> run -> build configuration: choisissez debug/release. Il peut contrôler le simulateur et le statut du code de votre iPhone de test.

  2. Edit scheme -> archive -> build configuration: choisissez debug/release. Il peut contrôler l'application du package de test et le statut du code de l'application App Store. enter image description here

28
Qun Li

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
geowar

Dans xcode 7, il existe un champ sous Apple LLVM 7.0 - prétraitement, appelé " Macros de préprocesseurs non utilisés dans les fichiers précompilés ... "Je mets 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
Fa.Shapouri

Encore une idée à 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 de pont d'en-tête:

#include "DebugMode.h"

usage:

DebugMode.isDebug()

Il n'est pas nécessaire d'écrire quelque chose dans les propriétés du projet Swift flags.

3
Vyacheslav

Xcode 10 +

#if DEBUG passera dans TOUT développement, construction ad-hoc, périphérique ou simulateur. C'est seulement faux pour une version de l'App Store.

Exemple:

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

Je ne sais pas si j'ai répondu à votre question, vous pourriez peut-être essayer le code suivant:

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