如何确定代码运行在DEBUG/RELEASE版本?

285

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

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

但是,在最终的应用商店版本中(即在发布模式下运行时),禁用所有这些功能是必不可少的(安全隐患)!

我会尽力回答我的问题,因此问题变成了“这种解决方案路径是否正确或最佳?”

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

#if( IS_DEBUG )  
#define MYLog(args...) NSLog(args)  
#else  
#define MYLog(args...)  
#endif  
12个回答

264
检查项目的构建设置,找到“Apple LLVM - 预处理”和“预处理器宏”调试选项,确保设置了DEBUG。可以通过选择项目并点击构建设置选项卡来完成此操作。搜索DEBUG 并查看是否已经设置。
但要注意,你可能会看到 DEBUG 更改为另一个变量名,例如 DEBUG_MODE。
然后,在源代码文件中有条件地编写 DEBUG 代码。
请参考以下截图:

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

#ifdef DEBUG

// Something to log your sensitive data here

#else

// 

#endif

谢谢您的回答。如果我尝试像这样制作:#ifdef DEBUG NSLog@("Something");#else//#endif,这不起作用。请问如何初始化按钮或记录一些内容到控制台,请问您能否编辑您的问题? - Malloc
在 Swift 中呢? - technophyle
在运行时,我是否可以通过编程方式更改此宏?我想启用一个按钮,以切换到生产API。在该按钮上,我想将DEBUG更改为0,并显示用户需要重新启动应用程序的消息。因此,下次它将使用生产API。 - Hiren Prajapati

164

若需使用 Swift 解决方案,请参考 SO 上的此讨论串

基本上,Swift 方案应如下所示:

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

此外,您需要在Swift编译器 - 自定义标志部分设置DEBUG符号,以通过-D DEBUG条目为Other Swift Flags键。以下是示例屏幕截图:

enter image description here


1
我在哪里找到Swift编译器的自定义标志? - Michael
2
@confile:我附上了一张截图,应该能清楚地指出在哪里找到。希望能帮到你! - Jeehut
1
请记住,这需要为使用它的特定框架/扩展进行定义!因此,如果您有键盘/今天的扩展,请在那里定义它。如果您有其他类型的框架,则同样适用。如果主要目标是Objective-C,则可能仅需要这样做。 - Warpzit
2
从Xcode 9+开始,你不再需要更改项目设置来创建新的Swift项目 - Senseful
1
从Xcode 9+开始,您不再需要更改新的Swift项目的项目设置 - Senseful
显示剩余3条评论

93

苹果在调试版本中已经包含了一个DEBUG标志,因此您不需要定义自己的标志。

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

//put this in prefix.pch

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

47

大多数答案都是关于如何设置 #ifdef DEBUG,但没有一个解释如何确定调试或发布版本。

我的观点:

  1. 编辑模式 → 运行 → 构建配置:选择调试/发布。它可以控制模拟器和您的测试 iPhone 的代码状态。

  2. 编辑模式 → 存档 → 构建配置:选择调试/发布。它可以控制测试包应用程序和 App Store 应用程序的代码状态。 输入图像描述


获奖答案!!它帮助我识别了我的问题。在我的情况下,我一直将“档案”模式保持为“调试”,并提交应用程序到应用商店。当从iTunes下载应用后检查结果时,它根本不起作用。因此,请确保在“构建/运行/归档”中仅在选择相应模式时才使用“DEBUG / RELEASE”。 - Bhavin_m

38

SwiftXcode 10+

#if DEBUG 在任何开发/Ad-hoc构建中都会通过,包括设备和模拟器。只有在App Store和TestFlight构建中才为false。

例如:

#if DEBUG
   print("Not App Store or TestFlight build")
#else
   print("App Store or TestFlight build")
#endif

15

如果您正在使用 Kotlin multiplatform 开发 iOS 应用,并想知道当前编译是调试模式还是发布模式,可以按照以下步骤进行操作:

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

8

zitao xiong的回答与我使用的相当接近; 我也包括文件名(通过剥离FILE的路径)。

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

8

6

还有一个检测思路:

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标志中编写任何内容。


6
在Xcode 7中,有一个叫做"Preprocessors Macros Not Used In Precompiled..."的字段位于"Apple LLVM 7.0 - preprocessing"下面。我在Debug前面加了DEBUG,并使用以下代码成功运行:
#ifdef DEBUG
    NSString* const kURL = @"http://debug.com";
#else
    NSString* const kURL = @"http://release.com";
#endif

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接