ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

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

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

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

n
nrudnyk

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

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

https://i.stack.imgur.com/LgTyF.png

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

#ifdef DEBUG

// Something to log your sensitive data here

#else

// 

#endif

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

有关 Swift 中的解决方案,请参阅 SO 上的 this thread

基本上,Swift 中的解决方案如下所示:

#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 符号。有关示例,请参见以下屏幕截图:

https://i.stack.imgur.com/rLan3.png


我在哪里可以找到 Swift 编译器 - 自定义标志?
@confile:我附上了一个屏幕截图,应该清楚在哪里可以找到。希望能帮助到你!
请记住,这需要为使用它的特定框架/扩展定义!因此,如果您有键盘/今日扩展名,请在此处定义。如果您有其他类型的框架相同的东西。这可能只有在主要目标是客观 c 时才有必要...
谢谢,除非您选择上面的 Allcombined,否则似乎不会出现 Other Swift Flags
谢谢!这就是我所缺少的。我为 Clang 而不是 Swift 设置了它。
N
Nick Lockwood

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

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

//put this in prefix.pch

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

Q
Qun Li

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

我的意见:

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


有奖回答!!!它可以帮助我确定我的问题。就我而言,我将 Archive 模式保持为 Debug 并将应用程序提交到应用商店。从 iTunes 下载应用程序后检查结果时,它根本不起作用。因此,请确保 DEBUG/RELEASE 仅在选择 Build/Run/Archive 中的相应模式时才有效。
K
Kirill Kudaev

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

g
geowar

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

F
Fa.Shapouri

在 xcode 7 中,Apple LLVM 7.0 - preprocessing 下有一个字段,称为“Preprocessors Macros Not Used In Precompiled ...”?我将 DEBUG 放在 Debug 前面,它通过使用以下代码对我有用:

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

V
Vyacheslav

只需再检测一个想法:

调试模式.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 flags 中写一些东西。


v
vikas kumar

为使用 Kotlin 多平台 ios 调试模式的人添加此功能。以下是确定构建是调试还是发布的方法。

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

P
P i

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

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

您能否详细说明该定义在做什么?它看起来很整洁,但我不太明白。 X 通常表示 Apple 保留的宏,而 PRETTY_FUNCTION 表示用户生成的东西,因此结果令人困惑
xx 是格式字符串,你可以使用任何你想要的,如果它与前面的字符串相同。您可以使用 FUNCTION ,但 PRETTY_FUNCTION 打印 Objective-C 方法名称。这link很好地解释了它。