web-dev-qa-db-ja.com

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

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

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

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

私はできる限り自分の質問に答えようとします。そのため、質問は'この解決策のパスは正しいか、それとも最善の方法ですか?'となります。

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

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

デバッグのために 'Apple LVM - Preprocessing'、 'Preprocessor Macros'でプロジェクトのビルド設定をチェックして 'DEBUG'が設定されていることを確認してください - プロジェクトを選択してbuild settingsタブをクリックしてください。 「DEBUG」を検索し、実際にDEBUGが設定されているかどうかを確認してください。

しかし注意してください。 DEBUGがDEBUG_MODEのような他の変数名に変更されたのを見るかもしれません。

Build Settings tab of my project settings

それから、ソースファイルにDEBUGを条件付きでコーディングします。

#ifdef DEBUG

// Something to log your sensitive data here

#else

// 

#endif
237
Damo

Swiftでの解決策については、SOの このスレッド を参照してください。

基本的にSwiftのは次のようになります。

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

さらに、Swift Compiler - Custom Flagsエントリを介してOther Swift Flagsキーの-D DEBUGセクションにDEBUGシンボルを設定する必要があります。例として、次のスクリーンショットを参照してください。

enter image description here

106
Dschee

Appleはデバッグビルドに既にDEBUGフラグを含んでいるので、あなたはあなた自身を定義する必要はありません。

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

//put this in prefix.pch

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

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

私の意見:

  1. スキームの編集 - >実行 - >ビルド設定:デバッグ/解放を選択してください。シミュレータとテスト用のiPhoneのコードステータスを制御できます。

  2. スキームの編集 - >アーカイブ - >ビルド設定:debug/releaseを選択してください。テストパッケージアプリとApp Storeアプリのコードステータスを制御できます。 enter image description here

27
Qun Li

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
8
geowar

Xcode 7では、Apple LLVM 7.0 - 前処理の下に ""というプリプロセッサマクロが使用されていないフィールドがあります。 "私はDEBUGDebugの前に置き、それは以下のコードを使うことで私のために働きます:

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

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

プロジェクトプロパティSwiftのフラグの中に何かを書く必要はありません。

2
Vyacheslav

私があなたの質問に答えたかどうかわからない、多分あなたはこれらのコードを試すことができます:

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

#if DEBUGは、開発/アドホックビルド、デバイス、またはシミュレータを渡します。 App Storeのリリースでは間違っています。

1
Kirill Kudaev