2012-01-30 10 views
186

Tworzę aplikację przetwarzającą wrażliwe dane z karty kredytowej.Xcode/iOS: Jak ustalić, czy kod jest uruchomiony w kompilacji DEBUG/RELEASE?

Jeśli mój kod działa w trybie debugowania, chcę zalogować te dane do konsoli i wykonać pewne zrzuty plików.

Jednak w ostatecznej wersji oprogramowania (tj. Gdy jest uruchomiony w trybie zwolnienia), konieczne jest wyłączenie tego wszystkiego (zagrożenie bezpieczeństwa)!

Spróbuję odpowiedzieć na moje pytanie najlepiej jak potrafię; więc pytanie staje się "Czy ta ścieżka rozwiązania jest najlepszym lub najlepszym sposobem na zrobienie tego?"

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

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

Odpowiedz

218

Sprawdź ustawienia Budowanie projektu w ramach „Apple LVM - wyprzedzającym”, „Preprocessor Makra” dla debugowania do upewnij się, że ustawiono "DEBUG" - zrób to, wybierając projekt i klikając kartę ustawień kompilacji. Wyszukaj 'DEBUG' i sprawdź, czy rzeczywiście ustawiono DEBUG.

Uważaj jednak. Możesz zobaczyć DEBUG zmieniony na inną nazwę zmiennej, taką jak DEBUG_MODE.

Build Settings tab of my project settings

kod następnie warunkowo do debugowania w plikach źródłowych

#ifdef DEBUG 

// Something to log your sensitive data here 

#else 

// 

#endif 
+0

Dziękuję za odpowiedź, jeśli spróbuję zrobić tak: '#ifdef DEBUG NSLog @ (" Something "); # else // # endif', to nie działa. Jak mogę zainicjować przycisk lub zalogować coś do konsoli? Czy możesz edytować swoje pytanie? – Malloc

+2

Powinno działać. Dlaczego nie wysłać nowego pytania z jakimś kodem? – Damo

+1

Damo, dzięki, robisz wielkie rzeczy od LPharmy ;-) –

2

Nie wiem, czy mi odpowiedział, że pytanie, może można spróbować te kod:

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

Czy mógłbyś dokładnie opisać, co robi ten definicja? Wygląda schludnie, ale nie rozumiem tego. __X__ Zwykle wskazuje makro zarezerwowane przez Apple, podczas gdy PRETTY_FUNCTION wskazuje na coś wygenerowanego przez użytkownika, więc wynik jest mylący –

+2

xx jest łańcuchem formatu, możesz użyć tego, co chcesz, jeśli jest identyczne z poprzednim ciągiem. Możesz użyć __FUNCTION__, ale PRETTY_FUNCTION wydrukuje nazwy metod Objective-C. ten [link] (http://stackoverflow.com/questions/300673/is-it-true-that-one-should-not-use-nslog-on-production-code) wyjaśnia to bardzo dobrze. –

85

Jabłko już zawiera DEBUG flagi debugowania buduje, więc nie trzeba definiować własne.

Można też rozważyć tylko przedefiniowanie NSLog do null pracy, gdy nie jest w trybie DEBUG, w ten sposób Twój kod będzie bardziej mobilny i można po prostu regularne NSLog oświadczenia:

//put this in prefix.pch 

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

zitao Xiong na odpowiedź jest bardzo blisko tego, z czego korzystam; Dołączam również nazwę pliku (poprzez usunięcie ścieżki 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

Do roztworu w Swift Proszę odnieść się do this thread na SO.

Zasadniczo rozwiązanie w Swiftbędzie wyglądać następująco:

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

Dodatkowo trzeba będzie ustawić DEBUG symbol Swift Compiler - Custom Flags części klucza Other Swift Flags poprzez wpisu -D DEBUG. Zobacz poniższy zrzut ekranu dla przykładu:

enter image description here

+2

Dzięki temu zadziałało dla mnie, brakowało mi "-D DEBUG" :) – Nitesh

+1

Gdzie znajdę Swift Compiler - Custom Flags? – confile

+2

@confile: Załączam zrzut ekranu, który powinien wyjaśnić, gdzie znaleźć. Mam nadzieję, że to pomoże! – Dschee

6

w Xcode 7, znajduje się pole pod firmy Apple LLVM 7.0 - przerób, który nazywa się "Preprocesory Makra Nie używany w prekompilowanego ... " kładę DEBUG przed Debug i to działa na mnie za pomocą poniższego kodu:

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

Większość odpowiedzi powiedział, że jak ustawić #ifdef DEBUG i żaden z nich mówiący jak zdeterminowany debug/zwolnić budować

Moja opinia:. To wybrać debug/release:

  1. Edit program -> budować konfigurację -> uruchom. może sterować symulatorem i testować status kodu iPhone'a.

  2. Edytuj schemat -> archiwum -> konfiguracja kompilacji: wybierz debugowanie/wydanie. Może kontrolować aplikację pakietu testowego i status kodu aplikacji App Store. enter image description here

+0

Dziękujemy! To jest DOKŁADNIE dlaczego tutaj przeglądałem. Mam wpisane do Google hasło "jak przetestować szybką wersję mojej nowej wersji aplikacji?" – Neo42

1

Jeszcze jeden pomysł, aby wykryć:

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 

reklamę d do nagłówka pliku mostu:

#include "DebugMode.h"

Wykorzystanie:

DebugMode.isDebug()

To nie jest potrzebne, aby napisać coś wewnątrz właściwości projektu Swift flagi.