Xcode / iOS:如何确定代码是否在DEBUG / RELEASE构build中运行?
我正在制作一个处理敏感信用卡数据的应用程序。
如果我的代码在debugging模式下运行,我想将这些数据logging到控制台并进行一些文件转储。
然而,在最终的appstore版本(即在release模式下运行时),所有这些都是禁用的(安全隐患)!
我会尽我所能地回答我的问题; 所以问题变成“这个解决scheme的path是正确还是最好的方法?”
// add `IS_DEBUG=1` to your debug build preprocessor settings #if( IS_DEBUG ) #define MYLog(args...) NSLog(args) #else #define MYLog(args...) #endif
在“Apple LVM – 预处理”,“预处理器macros”下检查项目的构build设置,以确保“DEBUG”正在被设置 – 通过select项目并单击构build设置选项卡来进行debugging。 search“DEBUG”并查看是否确实正在设置DEBUG。
不过要注意。 您可能会看到DEBUG更改为另一个variables名称,如DEBUG_MODE。
然后在您的源文件中有条件地编码DEBUG
#ifdef DEBUG // Something to log your sensitive data here #else // #endif
苹果已经在debugging版本中包含一个DEBUG
标志,所以你不需要定义你自己的。
您可能还想考虑在不处于DEBUG
模式时将NSLog
重新定义为空操作,这样您的代码将更具可移植性,您可以使用常规的NSLog
语句:
//put this in prefix.pch #ifndef DEBUG #undef NSLog #define NSLog(args, ...) #endif
有关Swift中的解决scheme,请参阅SO上的此主题 。
基本上Swift中的解决scheme如下所示:
#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
符号。 有关示例,请参阅以下屏幕截图:
大多数答案都说如何设置#ifdef DEBUG,而不是说如何确定debugging/发布版本。
我的想法:
-
编辑scheme – >运行 – >构buildconfiguration:selectdebugging/释放。 它可以控制模拟器和你testingiPhone的代码状态。
-
编辑scheme – >存档 – >build立configuration:selectdebugging/释放。 它可以控制testing包应用程序和App Store应用程序的代码状态。
子涛熊的答案与我所用的非常接近; 我还包括文件名(通过剥离FILE的path)。
#ifdef DEBUG #define NSLogDebug(format, ...) \ NSLog(@"<%s:%d> %s, " format, \ strrchr("/" __FILE__, '/') + 1, __LINE__, __PRETTY_FUNCTION__, ## __VA_ARGS__) #else #define NSLogDebug(format, ...) #endif
在xcode 7中,有一个在苹果LLVM 7.0下的字段– 预处理 ,名为“ Preprocessorsmacros在预编译中没有使用… ”我把DEBUG放在Debug前面,通过使用下面的代码对我有用:
#ifdef DEBUG NSString* const kURL = @"http://debug.com"; #else NSString* const kURL = @"http://release.com"; #endif
不知道如果我回答你的问题,也许你可以试试这些代码:
#ifdef DEBUG #define DLOG(xx, ...) NSLog( \ @"%s(%d): " \ xx, __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__ \ ) #else #define DLOG(xx, ...) ((void)0) #endif
只是另一个想法来检测:
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标志内写东西。