Xcode / iOS:如何确定代码是否在DEBUG / RELEASE构build中运行?

我正在制作一个处理敏感信用卡数据的应用程序。

如果我的代码在debugging模式下运行,我想将这些数据logging到控制台并进行一些文件转储。

然而,在最终的appstore版本(即在release模式下运行时),所有这些都是禁用的(安全隐患)!

我会尽我所能地回答我的问题; 所以问题变成“这个解决scheme的path是正确还是最好的方法?”

// add `IS_DEBUG=1` to your debug build preprocessor settings #if( IS_DEBUG ) #define MYLog(args...) NSLog(args) #else #define MYLog(args...) #endif 

在“Apple LVM – 预处理”,“预处理器macros”下检查项目的构build设置,以确保“DEBUG”正在被设置 – 通过select项目并单击构build设置选项卡来进行debugging。 search“DEBUG”并查看是否确实正在设置DEBUG。

不过要注意。 您可能会看到DEBUG更改为另一个variables名称,如DEBUG_MODE。

构建我的项目设置的设置选项卡

然后在您的源文件中有条件地编码DEBUG

 #ifdef DEBUG // Something to log your sensitive data here #else // #endif 

苹果已经在debugging版本中包含一个DEBUG标志,所以你不需要定义你自己的。

您可能还想考虑在不处于DEBUG模式时将NSLog重新定义为空操作,这样您的代码将更具可移植性,您可以使用常规的NSLog语句:

 //put this in prefix.pch #ifndef DEBUG #undef NSLog #define NSLog(args, ...) #endif 

有关Swift中的解决scheme,请参阅SO上的此主题 。

基本上Swift中解决scheme如下所示:

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

此外,您需要通过-D DEBUG条目在Swift Compiler - Custom Flags部分中设置Other Swift Flags键的DEBUG符号。 有关示例,请参阅以下屏幕截图:

在这里输入图像描述

大多数答案都说如何设置#ifdef DEBUG,而不是说如何确定debugging/发布版本。

我的想法:

  1. 编辑scheme – >运行 – >构buildconfiguration:selectdebugging/释放。 它可以控制模拟器和你testingiPhone的代码状态。

  2. 编辑scheme – >存档 – >build立configuration:selectdebugging/释放。 它可以控制testing包应用程序和App Store应用程序的代码状态。 在这里输入图像描述

子涛熊的答案与我所用的非常接近; 我还包括文件名(通过剥离FILE的path)。

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

在xcode 7中,有一个在苹果LLVM 7.0下的字段– 预处理 ,名为“ Preprocessorsmacros在预编译中没有使用… ”我把DEBUG放在Debug前面,通过使用下面的代码对我有用:

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

不知道如果我回答你的问题,也许你可以试试这些代码:

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

只是另一个想法来检测:

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 

添加到标题桥文件中:

#include "DebugMode.h"

用法:

DebugMode.isDebug()

不需要在项目属性swift标志内写东西。