如何确定代码是否在DEBUG / 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
172578 次浏览

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

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

在“Apple LLVM -预处理”下检查项目的构建设置,“预处理宏”用于调试,以确保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

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

你也可以考虑在不使用DEBUG模式时将NSLog重新定义为空操作,这样你的代码将更可移植,你可以只使用常规的NSLog语句:

//put this in prefix.pch


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

熊子韬的答案和我用的很接近;我还包含了文件名(通过剥离文件的路径)。

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

对于Swift中的解决方案,请参考SO上的这个线程

基本上Swift解决方案看起来像这样:

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

此外,您还需要通过-D DEBUG项为Other Swift Flags键设置DEBUG符号。请看下面的截图举例:

enter image description here

在xcode 7中,苹果llvm7.0 -预处理下有一个字段,名为"预编译中未使用的预处理宏…" 我把调试放在调试前面,它通过使用下面的代码为我工作:

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

大多数回答说如何设置#ifdef DEBUG,没有人说如何确定调试/发布构建。

我的意见:

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

  2. 编辑方案-> archive -> build configuration:选择debug / release。它可以控制测试包应用程序和app Store应用程序的代码状态。 李enter image description here < / p > < / >

还有一个想法需要检测:

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标志中写入内容。

斯威夫特Xcode 10 +

#if DEBUG将传入任何开发/特别构建、设备或模拟器。这只适用于App Store和TestFlight版本。

例子:

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

为使用芬兰湾的科特林 多平台 ios调试模式的人添加这个。下面是确定构建是调试还是发布的方法。

if (Platform.isDebugBinary) {
NSLog(message ?: "", "")
}
所以我在这里找到了我的方法,同时试图弄清楚为什么我的代码在我的发布构建中没有执行,而没有其他答案解决如何制作 #如果释放 工作。< / p >

我不希望在DEBUG模式下发生任何事情,所以我只使用#if RELEASE,假设(错误地)它会工作。

< p > #如果释放 //做一些特定的释放 # endif < / p >

你可以(至少从XCode 14开始)到项目->结合→Swift编译器-自定义标志(见下面的截图)。在RELEASE部分添加一个RELEASE值,如果RELEASE可以像上面一样工作,则使用#。

注意,你不希望通过释放来点击空白区域旁边的+,只需双击空白区域。如果你这样做了,它会添加一个“任何架构/任何sdk”;行,这使得RELEASE标志不能正常工作。

< p >正确版本: enter image description here < / p > < p >错误的版本: enter image description here < / p >