2012-01-30 77 views
186

我正在制作一个处理敏感信用卡数据的应用程序。Xcode/iOS:如何确定代码是否在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 

回答

218

检查项目的构建设置下的“苹果LVM - 预处理”,“预处理宏”调试到确保正在设置'DEBUG' - 通过选择项目并单击构建设置选项卡来执行此操作。搜索'DEBUG'并查看是否确实正在设置DEBUG。

请注意。您可能会看到DEBUG更改为另一个变量名称,例如DEBUG_MODE。在源文件中的DEBUG

Build Settings tab of my project settings

然后有条件代码

#ifdef DEBUG 

// Something to log your sensitive data here 

#else 

// 

#endif 
+0

Thanx为你的答案,如果我试图这样做:'#ifdef DEBUG NSLog @(“Something”);#else // #endif',这是行不通的。我怎样才能初始化一个按钮或登录到控制台请,你可以编辑你的问题? – Malloc 2012-06-21 01:58:45

+2

它应该工作。为什么不用一些代码发布一个新问题? – Damo 2012-06-21 07:56:55

+1

达摩,谢谢你,自LPharma以来做了大事;-) – 2016-02-04 15:56:35

2

不知道如果我回答你的问题,也许你可以试试这些代码:

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

你能详细说明一下这个定义在做什么吗?它看起来很整洁,但我不太明白。 __X__通常表示Apple保留的宏,而PRETTY_FUNCTION表示用户生成的内容,所以结果很混乱 – 2012-01-30 12:27:42

+2

xx是格式字符串,如果它与以前的字符串相同,则可以使用任何您想要的内容。您可以使用__FUNCTION__,但PRETTY_FUNCTION会打印Objective-C方法名称。这[链接](http://stackoverflow.com/questions/300673/is-it-true-that-one-should-not-use-nslog-on-production-code)解释得很好。 – 2012-01-31 09:21:56

85

苹果已经包括了DEBUG标志在调试版本,所以你不需要定义自己。

您可能还需要考虑只是重新定义NSLog为空操作时不DEBUG模式,这样,你的代码会更加便携,你可以只使用常规NSLog声明:

//put this in prefix.pch 

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

zitao熊的答案与我使用的非常接近;我还包括文件名(通过剥离FILE的路径)。

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

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

基本上在斯威夫特的解决方案是这样的:

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

此外,您将需要设置DEBUG符号Swift Compiler - Custom Flags节通过-D DEBUGOther Swift Flags关键。请参见下面的截图中的示例:

enter image description here

+2

感谢它为我工作,我错过了“-D DEBUG”:) – Nitesh 2015-06-03 08:40:20

+1

我在哪里可以找到Swift编译器 - 自定义标志? – confile 2015-09-19 12:23:57

+2

@confile:我附上了一张截图,应该明确在哪里可以找到。希望能帮助到你! – Dschee 2015-09-20 14:00:23

6

在Xcode 7,有下苹果LLVM 7.0场 - 预处理,这被称为“预处理器宏不使用预编译...“ 我把DEBUG调试的前面,它使用下面的代码工作对我来说:

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

大多数的答案说,如何设置的#ifdef DEBUG和他们没有说如何确定的调试/发布版本

我的看法:

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

  2. 编辑方案 - >存档 - >构建配置:选择调试/发布。它可以控制测试包应用和App Store应用的代码状态。 enter image description here

+0

谢谢!这就是我为什么浏览这里的原因。我搜索了“如何测试我的应用程序的发布版本?” – Neo42 2017-11-14 20:33:15

1

再多一次的想法来检测:

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 

广告d为标题桥文件:

#include "DebugMode.h"

用法:

DebugMode.isDebug()

写项目属性迅速标志里面的东西是不需要的。

相关问题