我正在制作处理敏感信用卡数据的应用。
如果我的代码在调试模式下运行,我想将此数据记录到控制台并进行一些文件转储。
然而,在最终的appstore版本上(即它在发布模式下运行时)必须禁用所有这些(安全隐患)!
我会尽力回答我的问题;所以问题变成'这个解决方案路径是正确的还是最好的方式?'
// add `IS_DEBUG=1` to your debug build preprocessor settings
#if( IS_DEBUG )
#define MYLog(args...) NSLog(args)
#else
#define MYLog(args...)
#endif
答案 0 :(得分:237)
在“Apple LVM - 预处理”,“预处理器宏”下检查项目的构建设置以进行调试以确保正在设置“DEBUG” - 通过选择项目并单击构建设置选项卡来执行此操作。搜索'DEBUG'并查看是否确实设置了DEBUG。
尽管注意。您可能会看到DEBUG已更改为另一个变量名称,例如DEBUG_MODE。
然后在源文件中有条件地编写DEBUG代码
#ifdef DEBUG
// Something to log your sensitive data here
#else
//
#endif
答案 1 :(得分:86)
Apple已在调试版本中包含DEBUG
标志,因此您无需定义自己的标志。
您可能还想考虑仅在NSLog
模式下将DEBUG
重新定义为空操作,这样您的代码将更具可移植性,您只需使用常规NSLog
语句:
//put this in prefix.pch
#ifndef DEBUG
#undef NSLog
#define NSLog(args, ...)
#endif
答案 2 :(得分:26)
大多数答案说如何设置#ifdef DEBUG并且没有人说如何确定调试/发布版本。
我的意见:
答案 3 :(得分:8)
zitao xiong的回答与我的使用非常接近;我还包括文件名(通过剥离文件的路径)。
#ifdef DEBUG
#define NSLogDebug(format, ...) \
NSLog(@"<%s:%d> %s, " format, \
strrchr("/" __FILE__, '/') + 1, __LINE__, __PRETTY_FUNCTION__, ## __VA_ARGS__)
#else
#define NSLogDebug(format, ...)
#endif
答案 4 :(得分:7)
在xcode 7中, Apple LLVM 7.0 - 预处理下有一个字段,称为“预编译器宏未在预编译中使用... ” 我把 DEBUG 放在 Debug 前面,它使用以下代码对我有用:
#ifdef DEBUG
NSString* const kURL = @"http://debug.com";
#else
NSString* const kURL = @"http://release.com";
#endif
答案 5 :(得分:2)
不确定我是否回答了您的问题,也许您可以尝试这些代码:
#ifdef DEBUG
#define DLOG(xx, ...) NSLog( \
@"%s(%d): " \
xx, __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__ \
)
#else
#define DLOG(xx, ...) ((void)0)
#endif
答案 6 :(得分:2)
还有一个要检测的想法:
<强> 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标记内写一些东西。
答案 7 :(得分:1)
#if DEBUG
将通过任何开发/临时构建,设备或模拟器。对于App Store版本,它只是错误的。
答案 8 :(得分:1)
为使用 Kotlin 多平台 ios 调试模式的人员添加此项。您可以通过以下方式确定构建是调试版还是发布版。
if (Platform.isDebugBinary) {
NSLog(message ?: "", "")
}