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 - การประมวลผลล่วงหน้า', 'Preprocessor Macros' เพื่อตรวจแก้จุดบกพร่องเพื่อให้แน่ใจว่าDEBUGมีการตั้งค่า - ทำสิ่งนี้โดยเลือกโครงการและคลิกที่แท็บการตั้งค่าการสร้าง ค้นหาDEBUGและมองเพื่อดูว่าDEBUGมีการตั้งแน่นอน

แม้ว่าให้ความสนใจ คุณอาจเห็น DEBUG เปลี่ยนเป็นชื่อตัวแปรอื่นเช่น DEBUG_MODE

แท็บสร้างการตั้งค่าของการตั้งค่าโครงการของฉัน

จากนั้นโค้ดตามเงื่อนไขสำหรับ DEBUG ในไฟล์ต้นฉบับของคุณ

#ifdef DEBUG

// Something to log your sensitive data here

#else

// 

#endif

ขอบคุณสำหรับคำตอบของคุณถ้าฉันพยายามทำสิ่งนี้: #ifdef DEBUG NSLog@("Something");#else//#endifมันไม่ทำงาน ฉันจะเริ่มต้นปุ่มหรือบันทึกสิ่งที่คอนโซลโปรดคุณสามารถแก้ไขคำถามของคุณ?
Malloc

แล้ว Swift ล่ะ?
technophyle

ฉันสามารถเปลี่ยนแมโครนี้โดยใช้โปรแกรมในเวลาทำงานได้หรือไม่ ฉันต้องการเปิดใช้งานปุ่มที่สลับไปยัง 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 Flagsส่วนของOther Swift Flagsคีย์ผ่าน-D DEBUGรายการ ดูภาพหน้าจอต่อไปนี้สำหรับตัวอย่าง:

ป้อนคำอธิบายรูปภาพที่นี่


1
ฉันจะค้นหา Swift Compiler - Custom Flags ได้ที่ไหน
confile

2
@confile: ฉันได้แนบภาพหน้าจอที่ควรระบุตำแหน่งที่ชัดเจน หวังว่ามันจะช่วย!
Jeehut

1
โปรดจำไว้ว่าต้องกำหนดสิ่งนี้สำหรับเฟรมเวิร์ก / ส่วนขยายเฉพาะที่ใช้งาน! ดังนั้นหากคุณมีส่วนขยายแป้นพิมพ์ / วันนี้ให้กำหนดไว้ที่นั่น หากคุณมีกรอบอื่น ๆ เหมือนกัน สิ่งนี้อาจจำเป็นถ้าเป้าหมายหลักคือวัตถุประสงค์ ...
Warpzit

ขอบคุณดูเหมือนว่าOther Swift Flagsที่สำคัญจะไม่ปรากฏจนกว่าคุณจะเลือกAllและcombinedเหนือ
ออสการ์วอชิงตันโพสต์

ขอบคุณ! นี่คือสิ่งที่ฉันหายไป ฉันตั้งไว้สำหรับเสียงดังกราว แต่ไม่ใช่ Swift
bugloaf

90

Apple ได้รวมDEBUGแฟล็กในการสร้างการดีบักดังนั้นคุณไม่จำเป็นต้องกำหนดของคุณเอง

คุณอาจต้องการพิจารณาเพียงแค่นิยามใหม่NSLogการดำเนินการเป็นโมฆะเมื่อไม่ได้อยู่ในDEBUGโหมดวิธีที่รหัสของคุณจะพกพาได้มากขึ้นและคุณสามารถใช้NSLogคำสั่งปกติ:

//put this in prefix.pch

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

33

คำตอบส่วนใหญ่กล่าวว่าวิธีการตั้งค่า #ifdef DEBUG และไม่มีใครบอกวิธีกำหนด debug / release build

ความคิดเห็นของฉัน:

  1. แก้ไขชุดรูปแบบ -> เรียกใช้ -> กำหนดค่าการสร้าง: เลือก debug / release มันสามารถควบคุมเครื่องจำลองและทดสอบรหัสสถานะของ iPhone

  2. แก้ไขแบบแผน -> เก็บถาวร -> การกำหนดค่าการสร้าง: เลือก debug / release สามารถควบคุมแอปแพ็คเกจทดสอบและสถานะรหัสแอปของ App Store ป้อนคำอธิบายรูปภาพที่นี่


คำตอบที่ได้รับรางวัล !!! มันช่วยให้ฉันระบุปัญหาของฉัน ในกรณีของฉันฉันเก็บArchiveโหมดไว้Debugและส่งแอปไปยังร้านค้าแอป เมื่อตรวจสอบผลลัพธ์หลังจากดาวน์โหลดแอปจาก iTunes แล้วจะไม่ทำงาน เพื่อให้แน่ใจว่าจะทำงานเฉพาะเมื่อเลือกโหมดเกี่ยวข้องในDEBUG/RELEASE Build/Run/Archive
Bhavin_m

13

SwiftและXcode 10+

#if DEBUGจะผ่านการพัฒนา / การสร้างอุปกรณ์หรือเครื่องมือจำลองใด ๆ มันเป็นเพียงเท็จสำหรับ App Store และ TestFlight สร้าง

ตัวอย่าง:

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

8

คำตอบของ zitao xiong นั้นใกล้เคียงกับที่ฉันใช้อยู่มาก ฉันยังรวมชื่อไฟล์ (โดยการแยกเส้นทางของไฟล์ )

#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ไว้หน้า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()

ไม่จำเป็นต้องเขียนสิ่งใดสิ่งหนึ่งภายในคุณสมบัติของแฟล็ก swift


1

ไม่แน่ใจว่าถ้าฉันตอบคำถามคุณบางทีคุณอาจลองใช้รหัสเหล่านี้:

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

คุณช่วยอธิบายรายละเอียดเกี่ยวกับสิ่งที่กำหนดไว้ได้ไหม? มันดูเรียบร้อย แต่ฉันไม่ค่อยเข้าใจ Xมักจะบ่งชี้ว่าแอปเปิ้ลลิขสิทธิ์แมโครขณะ PRETTY_FUNCTION บ่งชี้ว่าผู้ใช้บางสิ่งบางอย่างที่สร้างขึ้นเพื่อให้ผลที่ได้คือความสับสน
P ฉัน

2
xx คือสตริงรูปแบบคุณสามารถใช้อะไรก็ได้ที่คุณต้องการถ้ามันเหมือนกับสตริงก่อนหน้า คุณสามารถใช้FUNCTIONแต่ชื่อ PRETTY_FUNCTION พิมพ์ชื่อเมธอด Objective-C ลิงค์นี้อธิบายได้ดีมาก
Zitao Xiong
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.