Xcode / iOS:DEBUG / RELEASEビルドでコードが実行されているかどうかを確認する方法は?


241

機密のクレジットカードデータを処理するアプリを作成しています。

コードがデバッグモードで実行されている場合、このデータをコンソールに記録し、いくつかのファイルダンプを作成します。

ただし、最終的なappstoreバージョン(つまり、リリースモードで実行している場合)では、これをすべて無効にすることが重要です(セキュリティ上の問題)。

私はできる限り私の質問に答えようとします。したがって、質問は「このソリューションパスはそれを行うための正しい方法または最良の方法ですか?」になります。

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

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

回答:


247

「Apple LLVM-Preprocessing」、「Preprocessor Macros」でプロジェクトのビルド設定を確認し、デバッグDEBUGが設定されていることを確認します。これを行うには、プロジェクトを選択し、ビルド設定タブをクリックします。DEBUG実際DEBUGに設定されているかどうかを検索して確認します。

ただし注意してください。DEBUGがDEBUG_MODEなどの別の変数名に変更されている場合があります。

プロジェクト設定のビルド設定タブ

次に、条件付きでソースファイルのデバッグをコーディングします

#ifdef DEBUG

// Something to log your sensitive data here

#else

// 

#endif

あなたの答えをありがとう、私がこのようにしようとすると:#ifdef DEBUG NSLog@("Something");#else//#endif、これはうまくいきません。ボタンを初期化したり、コンソールに何かを記録したりするにはどうすればよいですか?質問を編集できますか?
Mallocは

Swiftではどうですか?
テクノフィル16/12/21

このマクロを実行時にプログラムで変更できますか?本番用APIに切り替えるボタンを有効にしたい。そのボタンで、DEBUGを0に変更し、ユーザーがアプリを再起動する必要があるというメッセージを表示します。次回は本番APIを使用します。
Hiren Prajapati

130

Swiftのソリューションについては、SOのこのスレッドを参照しください。

基本的に、Swiftソリューションは次のようになります。

#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
Swiftコンパイラ-カスタムフラグはどこにありますか?
confile

2
@confile:どこにあるかを明確にするスクリーンショットを添付しました。それが役に立てば幸い!
Jeehut

1
これは、それを使用する特定のフレームワーク/拡張に対して定義する必要があることに注意してください!キーボード/今日の拡張機能がある場合は、そこで定義します。他の種類のフレームワークと同じものがある場合。これは、主なターゲットが客観的である場合にのみ必要になる可能性があります...
Warpzit

おかげで、それ以上Other Swift Flagsを選択Allしない限り、キーは表示されないcombinedようです
Oscar Zhang

ありがとう!これは私が欠けていたものです。Clang用に設定しましたが、Swift用ではありませんでした。
バグローフ

90

AppleはすでにDEBUGデバッグビルドにフラグを組み込んでいるので、独自のフラグを定義する必要はありません。

モードでNSLogはないときにnull操作に再定義することを検討することもできます。そうDEBUGすることで、コードの移植性が向上し、通常のNSLogステートメントを使用できます。

//put this in prefix.pch

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

33

ほとんどの回答は、#ifdef DEBUGの設定方法と、デバッグ/リリースビルドを決定する方法についての回答はありませんでした。

私の意見:

  1. スキームの編集->実行->ビルド構成:デバッグ/リリースを選択します。シミュレータとテストiPhoneのコードステータスを制御できます。

  2. スキームの編集->アーカイブ->ビルド構成:デバッグ/リリースを選択します。テストパッケージアプリとApp Storeアプリのコードステータスを制御できます。 ここに画像の説明を入力してください


受賞した答え!!! 問題を特定するのに役立ちます。私の場合、私はArchiveモードを保持Debugし、アプリをアプリストアに送信しました。iTunesからアプリをダウンロードした後の結果を確認すると、機能しません。したがって、でDEBUG/RELEASEそれぞれのモードを選択した場合にのみ機能することを確認してくださいBuild/Run/Archive
Bhavin_m

13

SwiftおよびXcode 10以降

#if DEBUG任意の開発/アドホックビルド、デバイス、またはシミュレータを渡します。App StoreビルドとTestFlightビルドの場合はfalseです。

例:

#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-preprocessingの下に「プリプロセッサで使用されていないプリプロセッサマクロ...」と呼ばれるフィールドがありますか?私はデバッグの前にデバッグを置き、それは私のために以下のコードを使用することで機能します:

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

4

検出するもう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()

プロジェクトプロパティの迅速なフラグ内に何かを記述する必要はありません。


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はObjective-Cメソッド名を出力します。このリンクはそれを非常によく説明しています。
Zitao Xiong 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.