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

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

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

我会尽力回答我的问题;所以问题就变成了“这个解决方案是正确的还是最好的方法?”

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

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

当前回答

所以我在这里找到了我的方法,同时试图弄清楚为什么我的代码在我的发布版本中不能执行,而其他的答案都没有提到如何制作 #如果释放 工作。

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

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

你可以(至少从XCode 14开始)到Project -> Combined -> Swift Compiler - Custom Flags(见下面的截图)。在RELEASE部分添加一个RELEASE值,如果RELEASE可以像上面一样工作,则使用#。

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

正确的版本:

不正确的版本:

其他回答

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

我的意见:

编辑方案->运行->构建配置:选择调试/发布。它可以控制模拟器和测试iPhone的代码状态。 编辑方案->存档->构建配置:选择调试/发布。它可以控制测试包应用程序和app Store应用程序的代码状态。

还有一个想法需要检测:

调试模式.h

#import <Foundation/Foundation.h>

@interface DebugMode: NSObject
    +(BOOL) isDebug;
@end

调试模式.m

#import "DebugMode.h"

@implementation DebugMode
+(BOOL) isDebug {
#ifdef DEBUG
    return true;
#else
    return false;
#endif
}
@end

添加到头桥文件:

# include“DebugMode.h”

用法:

DebugMode isDebug()。

不需要在项目属性swift标志中写入内容。

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

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

Swift和Xcode 10+

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

例子:

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

Swift + Xcode 14更新。

从Xcode 8开始,你应该使用“活动编译条件”而不是“其他Swift标志”。从Xcode 9.3开始,苹果已经为新项目包含了DEBUG值:

这意味着你不需要改变任何项目设置,可以简单地使用#if DEBUG立即:

#if DEBUG
  print("something")
#endif