Xcode / iOS: DEBUG / RELEASE derlemesinde kodun çalışıp çalışmadığını nasıl belirleyebilirim?


241

Hassas kredi kartı verilerini işleyen bir uygulama yapıyorum.

Kodum hata ayıklama modunda çalışıyorsa, bu verileri konsola kaydetmek ve bazı dosya dökümlerini yapmak istiyorum.

Bununla birlikte, son uygulama mağazası sürümünde (yani yayın modunda çalışırken) tüm bunlar devre dışıdır (güvenlik tehlikesi)!

Soruma elimden geldiğince cevap vermeye çalışacağım; böylece soru 'Bu çözüm yolu bunu yapmanın doğru veya en iyi yolu mu?'

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

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

Yanıtlar:


248

Projenizin "Apple LLVM - Önişleme", "Önişlemci Makroları" altında oluşturulduğundan emin olmak için hata ayıklama olup olmadığını kontrol edin DEBUG; projeyi seçip oluşturma ayarları sekmesini tıklayarak bunu yapın. Ara DEBUGve aslında olmadığını görmek için bakmak DEBUGkümesi ediliyor.

Yine de dikkat edin. DEBUG'ın DEBUG_MODE gibi başka bir değişken adıyla değiştirildiğini görebilirsiniz.

Proje ayarlarımın Oluşturma Ayarları sekmesi

sonra koşullu olarak DEBUG kodunu kaynak dosyalarınızda kodlayın

#ifdef DEBUG

// Something to log your sensitive data here

#else

// 

#endif

Cevabınız için teşekkürler, böyle yapmaya çalışırsam:, #ifdef DEBUG NSLog@("Something");#else//#endifbu işe yaramaz. Bir düğmeyi nasıl başlatabilirim veya konsola bir şey kaydedebilirim, sorunuzu düzenleyebilir misiniz?
Malloc

Swift'te ne olacak?
technophyle

Bu makroyu çalışma zamanında programlı olarak değiştirebilir miyim? Üretim API'larına geçen bir düğmeyi etkinleştirmek istiyorum. Bu düğmede, DEBUG değerini 0 olarak değiştirmek ve kullanıcının uygulamayı yeniden başlatması gereken mesajı görüntülemek istiyorum. Bir dahaki sefere üretim API'lerini kullanacak.
Hiren Prajapati

130

Swift'teki bir çözüm için lütfen SO'daki bu konuya bakın .

Temel olarak Swift'teki çözüm şöyle görünecektir:

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

Ek olarak , bir giriş yoluyla anahtarın DEBUGsembolünü Swift Compiler - Custom Flagsbölüme ayarlamanız gerekecektir . Örnek için aşağıdaki ekran görüntüsüne bakın:Other Swift Flags-D DEBUG

resim açıklamasını buraya girin


1
Swift Derleyici - Özel Bayrakları nerede bulabilirim?
yapılandırma dosyasındaki

2
@confile: Nerede bulacağınızı netleştirmesi gereken bir ekran görüntüsü ekledim. Umarım yardımcı olur!
Jeehut

1
Bunun, onu kullanan belirli bir çerçeve / uzantı için tanımlanması gerektiğini unutmayın! Yani bir klavyeniz / bugün uzantınız varsa onu tanımlayın. Başka bir tür çerçeveniz varsa aynı şey. Bu sadece ana hedef nesnel hedef ise gerekli olabilir ...
Warpzit

teşekkürler, öyle görünüyor Other Swift Flagsseçtiğiniz sürece anahtar görünmez Allve combinedyukarıda
Oscar Zhang

Teşekkürler! Bu benim eksikti. Clang için ayarladım ama Swift için değil.
bugloaf

90

Apple zaten DEBUGhata ayıklama derlemelerinde bir bayrak içerir , bu yüzden kendinizinkini tanımlamanız gerekmez.

Ayrıca NSLog, DEBUGmodda değilken null bir işlemi yeniden tanımlamayı düşünebilirsiniz , böylece kodunuz daha taşınabilir olur ve normal NSLogifadeleri kullanabilirsiniz :

//put this in prefix.pch

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

33

Çoğu cevap #ifdef DEBUG nasıl ayarlanır ve hiçbiri hata ayıklama / sürüm derleme nasıl belirtebilirsiniz dedi.

Benim fikrim:

  1. Şemayı düzenle -> çalıştır -> yapılandırma yapılandırması: hata ayıklama / bırakmayı seçin. Simülatörü ve test iPhone'unuzun kod durumunu kontrol edebilir.

  2. Düzeni düzenle -> arşiv -> yapılandırma yapılandırması: hata ayıklama / bırakmayı seçin. Test paketi uygulamasını ve App Store uygulamasının kod durumunu kontrol edebilir. resim açıklamasını buraya girin


Ödüllü cevap !!! sorunumu tanımlamamda bana yardımcı oluyor. Benim durumumda, Archivemodu tuttum Debugve uygulamayı uygulama mağazasına gönderdim. İTunes'tan uygulama indirildikten sonra sonucu kontrol ederken, işe yaramaz. Bu nedenle, DEBUG/RELEASEyalnızca ilgili mod seçildiğinde çalıştığından emin olun Build/Run/Archive.
Bhavin_m

13

Swift ve Xcode 10+

#if DEBUGHERHANGİ bir geliştirme / geçici yapı, cihaz veya simülatörden geçecektir. Sadece App Store ve TestFlight derlemeleri için yanlıştır.

Misal:

#if DEBUG
   print("Not App Store build")
#else
   print("App Store build")
#endif

8

zitao xiong'un cevabı kullandığım şeye oldukça yakın; Ayrıca dosya adını da ekliyorum ( DOSYA yolunu sıyırarak ).

#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'de, Apple LLVM 7.0 altında önişlemede " Ön Derlenmiş Makrolarda Kullanılmayan Önişlemci Makroları ... " adlı bir alan var mı? DEBUG hata ayıklama önünde koymak ve aşağıdaki kodu kullanarak benim için çalışır:

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

4

Tespit etmek için sadece bir fikir daha:

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

başlık köprüsü dosyasına ekle:

#include "DebugMode.h"

kullanımı:

DebugMode.isDebug()

Proje özelliklerinin hızlı bayrakları içine bir şey yazmak gerekmez.


1

Size soruyu cevapladıysam emin değilim, belki bu kodu deneyebilirsiniz:

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

Tanımın tam olarak ne yaptığını biraz açıklayabilir misiniz? Düzgün görünüyor, ama tam anlamıyorum. X Genellikle Apple için ayrılmış bir makroyu belirtirken, PRETTY_FUNCTION kullanıcının oluşturduğu bir şeyi gösterir, bu nedenle sonuç kafa karıştırıcıdır
P i

2
xx biçim dizesidir, önceki dizeyle aynıysa, istediğinizi kullanabilirsiniz. FUNCTION kullanabilirsiniz , ancak PRETTY_FUNCTION Objective-C yöntem adlarını yazdırın. bu bağlantı çok iyi açıklıyor.
Zitao Xiong
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.