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  

Відповіді:


248

Перевірте параметри складання проекту в розділі "Apple LLVM - попередня обробка", "Макроси препроцесора" на предмет налагодження, щоб переконатися, що DEBUGце встановлено - зробіть це, вибравши проект і натиснувши на вкладку налаштувань збірки. Шукайте DEBUGта дивіться, чи дійсно DEBUGвстановлено.

Однак зверніть увагу. Ви можете побачити, що DEBUG змінено на іншу назву змінної, наприклад DEBUG_MODE.

Вкладка "Налаштування" в настройках мого проекту

то умовно код для DEBUG у вихідних файлах

#ifdef DEBUG

// Something to log your sensitive data here

#else

// 

#endif

Дякую за вашу відповідь, якщо я спробую зробити так: #ifdef DEBUG NSLog@("Something");#else//#endifце не працює. Як я можу ініціалізувати кнопку або записати щось на консоль, будь ласка, ви можете редагувати своє запитання?
Маллок

А як у Свіфті?
технофіл

чи можу я змінити цей макро програмно під час виконання? Я хочу включити кнопку, яка переходить на виробничі API. На цій кнопці я хочу змінити DEBUG на 0 і відобразити повідомлення, яке потрібно перезапустити користувачеві. Тож наступного разу він використовуватиме виробничі API.
Хірен Праджапаті

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 Flagsрозділі для Other Swift Flagsключа через -D DEBUGзапис. Див. Приклад нижче:

введіть тут опис зображення


1
Де я можу знайти компілятор Swift - спеціальні прапори?
confile

2
@confile: Я додав скріншот, який повинен чітко пояснити, де його знайти. Сподіваюся, це допомагає!
Jeehut

1
Пам'ятайте, що це потрібно визначити для конкретного фреймворка / розширення, яке ним використовується! Отже, якщо у вас є розширення для клавіатури / сьогодні, визначте його там. Якщо у вас є якісь інші рамки, те саме. Це може бути необхідно , якщо основною метою є мета з ...
Warpzit

дякую, здається, 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. Редагувати схему -> архів -> конфігурація збірки: вибрати налагодження / випуск. Він може керувати тестовим пакетом програми та кодом додатка App Store. введіть тут опис зображення


Нагороджена відповідь !!! це допомагає мені визначити свою проблему. У моєму випадку я втримав Archiveрежим Debugі подав додаток у магазин додатків. Під час перевірки результату після завантаження програми з iTunes він просто не працює. Тому переконайтеся, що DEBUG/RELEASEвін працює лише у вибраному відповідному режимі Build/Run/Archive.
Bhavin_m

13

Швидкий та Xcode 10+

#if DEBUGбуде передаватися в будь-яку розробку / спеціальну побудову, пристрій чи симулятор. Це неправда лише для додатків App Store та тестів TestFlight.

Приклад:

#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 - попередня обробка , яка називається " Макроси попередніх процесорів , які не використовуються у попередньо складеному ... "? Я ставлю 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 друкує назви методу Objective-C. це посилання пояснює це дуже добре.
Zitao Xiong
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.