2012-01-30 15 views
186

मैं एक ऐप बना रहा हूं जो संवेदनशील क्रेडिट कार्ड डेटा को संसाधित करता है।एक्सकोड/आईओएस: यह निर्धारित करने के लिए कि क्या DEBUG/रिलीज निर्माण में कोड चल रहा है या नहीं?

यदि मेरा कोड डीबग मोड में चल रहा है, तो मैं इस डेटा को कंसोल पर लॉग करना चाहता हूं और कुछ फ़ाइल डंप करना चाहता हूं।

हालांकि अंतिम ऐपस्टोर संस्करण (यानी जब यह रिलीज मोड में चल रहा है) पर यह आवश्यक है कि यह सब अक्षम है (सुरक्षा खतरे)!

मैं अपने प्रश्न का उत्तर देने की कोशिश करूंगा जितना मैं कर सकता हूं; तो सवाल बन गया है 'क्या यह समाधान पथ करने का सही या सबसे अच्छा तरीका है?'

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

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

उत्तर

218

के तहत 'एप्पल एलवीएम - Preprocessing' अपने प्रोजेक्ट की निर्माण सेटिंग्स की जाँच करने के लिए डिबग के लिए, 'प्रीप्रोसेसर मैक्रो' सुनिश्चित करें कि 'DEBUG' सेट किया जा रहा है - प्रोजेक्ट का चयन करके और बिल्ड सेटिंग्स टैब पर क्लिक करके ऐसा करें। 'DEBUG' के लिए खोजें और यह देखने के लिए देखें कि वास्तव में DEBUG सेट किया जा रहा है या नहीं।

हालांकि ध्यान दें। आप DEBUG को किसी अन्य चर नाम जैसे DEBUG_MODE में बदल सकते हैं। अपनी स्रोत फ़ाइल में डीबग के लिए

Build Settings tab of my project settings

तो सशर्त कोड

#ifdef DEBUG 

// Something to log your sensitive data here 

#else 

// 

#endif 
+0

Thanx आपके उत्तर के लिए, अगर मैं ऐसा करने की कोशिश करता हूं: '#ifdef DEBUG NSLog @ (" कुछ "); # else // # endif', यह काम नहीं करता है। मैं कंसोल पर कुछ बटन कैसे शुरू कर सकता हूं या लॉग इन कर सकता हूं, क्या आप अपना प्रश्न संपादित कर सकते हैं? – Malloc

+2

यह काम करना चाहिए। कुछ कोड के साथ एक नया सवाल क्यों नहीं पोस्ट करें? – Damo

+1

दामो, धन्यवाद आदमी, एलपीर्मा के बाद से बड़ी चीजें कर रहा है ;-) –

2

सुनिश्चित नहीं हैं कि अगर मैं आप से सवाल, हो सकता है आप इन कोड की कोशिश कर सकते जवाब:

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

क्या आप परिभाषित कर सकते हैं कि वास्तव में क्या परिभाषित किया जा रहा है? यह साफ दिखता है, लेकिन मुझे काफी कुछ नहीं मिला है। __X__ आमतौर पर एक ऐप्पल आरक्षित मैक्रो इंगित करता है, जबकि PRETTY_FUNCTION कुछ उपयोगकर्ता उत्पन्न करता है, इसलिए परिणाम भ्रमित कर रहा है –

+2

xx प्रारूप स्ट्रिंग है, यदि आप पिछली स्ट्रिंग के समान हैं, तो आप जो भी चाहें उसका उपयोग कर सकते हैं। आप __FUNCTION__ का उपयोग कर सकते हैं, लेकिन PRETTY_FUNCTION प्रिंट उद्देश्य-सी विधि नाम। यह [लिंक] (http://stackoverflow.com/questions/300673/is-it-true-that-one-should-not-use-nslog-on-production-code) इसे बहुत अच्छी तरह समझाएं। –

85

एप्पल पहले से ही डिबग में एक DEBUG झंडा, बनाता है ताकि आप अपने को परिभाषित करने की जरूरत नहीं है भी शामिल है।

आप, साथ ही जब DEBUG मोड में नहीं एक अशक्त संचालन के लिए NSLog को पुनर्परिभाषित, कि जिस तरह से अपने कोड अधिक पोर्टेबल हो जाएगा विचार करना चाह सकते और आप बस का उपयोग कर सकते नियमित NSLog बयान:

//put this in prefix.pch 

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

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 
80
स्विफ्ट में एक समाधान इतने पर this thread का संदर्भ लें के लिए

मूल रूप से स्विफ्ट में समाधान इस प्रकार दिखाई देगा:

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

साथ ही आप एक -D DEBUG प्रविष्टि के माध्यम से Other Swift Flags कुंजी के लिए Swift Compiler - Custom Flags खंड में DEBUG प्रतीक सेट करने के लिए की आवश्यकता होगी। एक उदाहरण के लिए निम्न स्क्रीनशॉट देखें:

enter image description here

+2

धन्यवाद यह मेरे लिए काम करता है, मैं "-D DEBUG" गायब था :) – Nitesh

+1

मुझे स्विफ्ट कंपाइलर - कस्टम ध्वज कहां मिलेंगे? – confile

+2

@confile: मैंने एक स्क्रीनशॉट संलग्न किया है जिसे स्पष्ट करना चाहिए कि कहां मिलना है। आशा करता हूँ की ये काम करेगा! – Dschee

6

xcode 7 में, वहाँ के तहत एप्पल LLVM 7.0 एक क्षेत्र है - preprocessing, जो तथाकथित "preprocessors मैक्रो Precompiled में उपयोग नहीं किया ... " मैं डीबग के सामने डीबग रख दिया और यह नीचे दिए गए कोड का उपयोग करके मेरे लिए काम करता है:

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

अधिकांश जवाब कहा कैसे #ifdef डीबग और उनमें से कोई कह डिबग नियत करने के लिए कैसे स्थापित करने के लिए है कि/रिलीज निर्माण

मेरे राय:।

  1. संपादित योजना -> चलाने -> विन्यास का निर्माण:। चुनें डिबग/रिलीज यह सिम्युलेटर और आपके परीक्षण आईफोन की कोड स्थिति को नियंत्रित कर सकते हैं।

  2. योजना संपादित करें -> संग्रह -> कॉन्फ़िगरेशन बनाएं: डीबग/रिलीज़ चुनें। यह परीक्षण पैकेज ऐप और ऐप स्टोर ऐप की कोड स्थिति को नियंत्रित कर सकता है। enter image description here

+0

धन्यवाद! यही कारण है कि मैंने यहां क्यों ब्राउज़ किया। मैं "मैं अपने ऐप के रिलीज संस्करण को तेजी से कैसे परीक्षण करूं?" – Neo42

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 

विज्ञापन हैडर पुल फ़ाइल में घ:

#include "DebugMode.h"

उपयोग:

DebugMode.isDebug()

यह परियोजना गुण तेज झंडे के अंदर कुछ लिखने के लिए आवश्यक नहीं है।

संबंधित मुद्दे

 संबंधित मुद्दे