Xcode / iOS: यह निर्धारित करने के लिए कि क्या कोड DEBUG / RELEASE में चल रहा है?


241

मैं एक ऐप बना रहा हूं जो संवेदनशील क्रेडिट कार्ड डेटा को प्रोसेस करता है।

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

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

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

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

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

जवाबों:


248

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

हालांकि ध्यान दीजिए। आप देख सकते हैं कि DEBUG एक और परिवर्तनशील नाम जैसे DEBUG_MODE में बदल गया है।

मेरी परियोजना सेटिंग्स का सेटिंग टैब बनाएँ

तब अपने स्रोत फ़ाइलों में DEBUG के लिए सशर्त कोड

#ifdef DEBUG

// Something to log your sensitive data here

#else

// 

#endif

आपके जवाब के लिए थैंक्स, अगर मैं इस तरह से बनाने की कोशिश करता हूं: #ifdef DEBUG NSLog@("Something");#else//#endifयह काम नहीं करता है। मैं एक बटन को इनिशियलाइज़ कैसे कर सकता हूँ या कंसोल में कुछ लॉग इन कर सकता हूँ, क्या आप अपना प्रश्न संपादित कर सकते हैं?
मल्लोक

स्विफ्ट के बारे में क्या?
टेक्नोफाइल

क्या मैं इस मैक्रो को प्रोग्राम टाइम पर बदल सकता हूं? मैं एक बटन सक्षम करना चाहता हूं जो उत्पादन एपीआई पर स्विच करता है। उस बटन पर, मैं DEBUG को 0 में बदलना चाहता हूं और उस संदेश को प्रदर्शित करता हूं जिसे उपयोगकर्ता को ऐप को पुनरारंभ करने की आवश्यकता है। इसलिए अगली बार यह उत्पादन एपीआई का उपयोग करेगा।
हिरेन प्रजापति

130

स्विफ्ट में समाधान के लिए कृपया एसओ पर इस धागे को देखें ।

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

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

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

यहां छवि विवरण दर्ज करें


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

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

1
याद रखें कि इसे उपयोग करने वाले विशिष्ट ढांचे / विस्तार के लिए परिभाषित किया जाना चाहिए! इसलिए यदि आपके पास एक कीबोर्ड / आज एक्सटेंशन है, तो इसे वहां परिभाषित करें। यदि आपके पास किसी अन्य प्रकार की रूपरेखा समान है। यह केवल तभी आवश्यक हो सकता है जब मुख्य लक्ष्य वस्तुनिष्ठ हो ...
तानापिट

धन्यवाद, ऐसा लगता है कि Other Swift Flagsकुंजी तब तक प्रकट नहीं होगी जब तक आप चयन नहीं करते Allऔर combinedऊपर
ऑस्कर जांग

धन्यवाद! यह वही है जो मुझे याद आ रहा था। मैंने इसे क्लैंग के लिए सेट किया था लेकिन स्विफ्ट के लिए नहीं।
Bugloaf

90

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

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

//put this in prefix.pch

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

33

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

मेरी राय:

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

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


पुरस्कृत उत्तर !!! यह मेरी समस्या को पहचानने में मेरी मदद करता है। मेरे मामले में, मैंने ऐप स्टोर में ऐप को Archiveमोड Debugऔर सबमिट कर रखा था । आईट्यून्स से ऐप डाउनलोड करने के बाद परिणाम की जाँच करते समय यह बस काम नहीं करता है। इसलिए सुनिश्चित करें कि DEBUG/RELEASEसंबंधित मोड में चयनित होने पर ही काम करता है Build/Run/Archive
भाविन_म ६

13

स्विफ्ट और Xcode 10+

#if DEBUGकिसी भी विकास / तदर्थ निर्माण, उपकरण या सिम्युलेटर में पास होगा। यह केवल ऐप स्टोर और टेस्टफलाइट बिल्ड के लिए गलत है।

उदाहरण:

#if DEBUG
   print("Not App Store build")
#else
   print("App Store build")
#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

7

Xcode 7 में, Apple LLVM 7.0 के तहत एक क्षेत्र है - प्रीप्रोसेसिंग , जिसे " Preprocessors Macros Not Used In Precompiled ... " कहा जाता है? मैंने DEBUG को सामने रखा डिबग और यह नीचे दिए गए कोड का उपयोग करके मेरे लिए काम करता है:

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

4

पता लगाने के लिए बस एक और विचार:

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()

प्रोजेक्ट प्रॉपर्टीज स्विफ्ट फ्लैग के अंदर कुछ लिखने की जरूरत नहीं है।


1

यकीन नहीं होता अगर मैंने आपसे सवाल जवाब किया, तो शायद आप ये कोड आज़मा सकते हैं:

#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 कुछ उपयोगकर्ता को इंगित करता है, इसलिए परिणाम भ्रामक है
P i

2
xx प्रारूप स्ट्रिंग है, आप जो चाहें उसका उपयोग कर सकते हैं, यदि यह पिछले स्ट्रिंग के समान है। आप FUNCTION का उपयोग कर सकते हैं , लेकिन PRETTY_FUNCTION प्रिंट ऑब्जेक्टिव-सी विधि नाम। यह लिंक इसे बहुत अच्छी तरह से समझाता है।
जिताओ जिओंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.