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

时间:2012-01-30 11:26:27

标签: ios xcode debugging preprocessor release

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

如果我的代码在调试模式下运行,我想将此数据记录到控制台并进行一些文件转储。

然而,在最终的appstore版本上(即它在发布模式下运行时)必须禁用所有这些(安全隐患)!

我会尽力回答我的问题;所以问题变成'这个解决方案路径是正确的还是最好的方式?'

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

#if( IS_DEBUG )  
#define MYLog(args...) NSLog(args)  
#else  
#define MYLog(args...)  
#endif  

9 个答案:

答案 0 :(得分:237)

在“Apple LVM - 预处理”,“预处理器宏”下检查项目的构建设置以进行调试以确保正在设置“DEBUG” - 通过选择项目并单击构建设置选项卡来执行此操作。搜索'DEBUG'并查看是否确实设置了DEBUG。

尽管注意。您可能会看到DEBUG已更改为另一个变量名称,例如DEBUG_MODE。

Build Settings tab of my project settings

然后在源文件中有条件地编写DEBUG代码

#ifdef DEBUG

// Something to log your sensitive data here

#else

// 

#endif

答案 1 :(得分:86)

Apple已在调试版本中包含DEBUG标志,因此您无需定义自己的标志。

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

//put this in prefix.pch

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

答案 2 :(得分:26)

大多数答案说如何设置#ifdef DEBUG并且没有人说如何确定调试/发布版本。

我的意见:

  1. 编辑方案 - >跑 - >构建配置:选择debug / release。它可以控制模拟器和测试iPhone的代码状态。

  2. 编辑方案 - >存档 - >构建配置:选择debug / release。它可以控制测试包应用程序和App Store应用程序的代码状态。 enter image description here

答案 3 :(得分:8)

zitao xiong的回答与我的使用非常接近;我还包括文件名(通过剥离文件的路径)。

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

答案 4 :(得分:7)

在xcode 7中, Apple LLVM 7.0 - 预处理下有一个字段,称为“预编译器宏未在预编译中使用... ” 我把 DEBUG 放在 Debug 前面,它使用以下代码对我有用:

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

答案 5 :(得分:2)

不确定我是否回答了您的问题,也许您可​​以尝试这些代码:

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

答案 6 :(得分:2)

还有一个要检测的想法:

<强> 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标记内写一些东西。

答案 7 :(得分:1)

#if DEBUG将通过任何开发/临时构建,设备或模拟器。对于App Store版本,它只是错误的。

答案 8 :(得分:1)

为使用 Kotlin 多平台 ios 调试模式的人员添加此项。您可以通过以下方式确定构建是调试版还是发布版。

if (Platform.isDebugBinary) {
     NSLog(message ?: "", "")
}