Xcode / iOS: Làm cách nào để xác định xem mã có đang chạy trong bản dựng DEBUG / RELEASE không?


241

Tôi đang làm một ứng dụng xử lý dữ liệu thẻ tín dụng nhạy cảm.

Nếu mã của tôi đang chạy trong chế độ gỡ lỗi, tôi muốn đăng nhập dữ liệu này vào bàn điều khiển và thực hiện một số kết xuất tệp.

Tuy nhiên, trên phiên bản cửa hàng ứng dụng cuối cùng (tức là khi nó đang chạy ở chế độ phát hành), tất cả những thứ này đều bị vô hiệu hóa (nguy cơ bảo mật)!

Tôi sẽ cố gắng trả lời câu hỏi của mình tốt nhất có thể; vì vậy câu hỏi trở thành 'giải pháp này là cách đúng đắn hay tốt nhất để làm điều đó?'

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

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

Câu trả lời:


247

Kiểm tra cài đặt bản dựng dự án của bạn trong 'Apple LLVM - Tiền xử lý', 'Macro tiền xử lý' để gỡ lỗi để đảm bảo DEBUGđược đặt - thực hiện điều này bằng cách chọn dự án và nhấp vào tab cài đặt bản dựng. Tìm kiếm DEBUGvà xem để thực sự DEBUGđược thiết lập.

Hãy chú ý mặc dù. Bạn có thể thấy DEBUG đã thay đổi thành một tên biến khác, chẳng hạn như DEBUG_MODE.

Xây dựng tab Cài đặt của cài đặt dự án của tôi

sau đó mã có điều kiện cho DEBUG trong các tệp nguồn của bạn

#ifdef DEBUG

// Something to log your sensitive data here

#else

// 

#endif

Thanx cho câu trả lời của bạn, nếu tôi cố gắng thực hiện như thế này : #ifdef DEBUG NSLog@("Something");#else//#endif, điều này không hoạt động. Làm thế nào tôi có thể khởi tạo một nút hoặc đăng nhập một cái gì đó vào bàn điều khiển, bạn có thể chỉnh sửa câu hỏi của bạn?
Malloc

Còn về Swift thì sao?
Technophyle

Tôi có thể thay đổi macro này theo chương trình khi chạy không? Tôi muốn kích hoạt một nút chuyển sang API sản xuất. Trên nút đó, tôi muốn thay đổi DEBUG thành 0 và hiển thị thông báo mà người dùng cần để khởi động lại ứng dụng. Vì vậy, lần tới nó sẽ sử dụng API sản xuất.
Hiren Prajapati

130

Để biết giải pháp trong Swift, vui lòng tham khảo chủ đề này trên SO.

Về cơ bản, giải pháp trong Swift sẽ như thế này:

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

Ngoài ra, bạn sẽ cần đặt DEBUGbiểu tượng trong Swift Compiler - Custom Flagsphần cho Other Swift Flagskhóa thông qua một -D DEBUGmục. Xem ảnh chụp màn hình sau đây cho một ví dụ:

nhập mô tả hình ảnh ở đây


1
Tôi tìm Swift Compiler - Cờ tùy chỉnh ở đâu?
confile

2
@confile: Tôi đã đính kèm một ảnh chụp màn hình cần làm rõ nơi cần tìm. Hy vọng nó giúp!
Jeehut

1
Hãy nhớ điều này cần được xác định cho khung / phần mở rộng cụ thể sử dụng nó! Vì vậy, nếu bạn có một phần mở rộng bàn phím / ngày hôm nay, hãy xác định nó ở đó. Nếu bạn có một số loại khuôn khổ tương tự. Điều này chỉ có thể cần thiết nếu mục tiêu chính là mục tiêu c ...
Warpzit

cảm ơn, có vẻ như Other Swift Flagskhóa sẽ không xuất hiện trừ khi bạn chọn Allcombinedở trên
Oscar Zhang

Cảm ơn! Đây là những gì tôi đã thiếu. Tôi đã đặt nó cho Clang nhưng không phải Swift.
bugloaf

90

Apple đã bao gồm một DEBUGcờ trong các bản dựng gỡ lỗi, vì vậy bạn không cần phải xác định chính mình.

Bạn cũng có thể muốn xem xét chỉ xác định lại NSLoghoạt động null khi không ở DEBUGchế độ, theo cách đó, mã của bạn sẽ dễ mang theo hơn và bạn chỉ có thể sử dụng các NSLogcâu lệnh thông thường :

//put this in prefix.pch

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

33

Hầu hết các câu trả lời đều nói rằng làm thế nào để đặt #ifdef DEBUG và không ai trong số họ nói cách xác định gỡ lỗi / phát hành bản dựng.

Ý kiến ​​cá nhân của tôi:

  1. Chỉnh sửa lược đồ -> chạy -> xây dựng cấu hình: chọn gỡ lỗi / phát hành. Nó có thể kiểm soát trình giả lập và trạng thái mã thử nghiệm của iPhone của bạn.

  2. Chỉnh sửa lược đồ -> lưu trữ -> xây dựng cấu hình: chọn gỡ lỗi / phát hành. Nó có thể kiểm soát ứng dụng gói thử nghiệm và trạng thái mã của ứng dụng App Store. nhập mô tả hình ảnh ở đây


Trả lời giải thưởng !!! nó giúp tôi xác định vấn đề của mình Trong trường hợp của tôi, tôi đã giữ Archivechế độ Debugvà gửi ứng dụng đến cửa hàng ứng dụng. Khi kiểm tra kết quả sau khi tải xuống ứng dụng từ iTunes, đơn giản là nó không hoạt động. Vì vậy, hãy chắc chắn rằng DEBUG/RELEASEchỉ hoạt động khi được chọn chế độ tương ứng trong Build/Run/Archive.
Bhavin_m

13

SwiftXcode 10+

#if DEBUGsẽ vượt qua trong bất kỳ bản dựng, thiết bị hoặc trình giả lập nào. Nó chỉ sai đối với các bản dựng App Store và TestFlight.

Thí dụ:

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

8

Câu trả lời của zitao xiong khá gần với những gì tôi sử dụng; Tôi cũng bao gồm tên tệp (bằng cách tước khỏi đường dẫn của TẬP_TIN ).

#ifdef DEBUG
    #define NSLogDebug(format, ...) \
    NSLog(@"<%s:%d> %s, " format, \
    strrchr("/" __FILE__, '/') + 1, __LINE__, __PRETTY_FUNCTION__, ## __VA_ARGS__)
#else
    #define NSLogDebug(format, ...)
#endif

7

Trong xcode 7, có một trường trong Apple LLVM 7.0 - tiền xử lý , được gọi là " Macro tiền xử lý không được sử dụng trong tiền biên dịch ... "? Tôi đặt DEBUG trước Debug và nó hoạt động với tôi bằng cách sử dụng mã dưới đây:

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

4

Chỉ cần một ý tưởng nữa để phát hiện:

Gỡ lỗi.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

thêm vào tập tin cầu tiêu đề:

#include "DebugMode.h"

sử dụng:

DebugMode.isDebug()

Không cần thiết phải viết một cái gì đó bên trong các cờ thuộc tính dự án.


1

Không chắc chắn nếu tôi trả lời câu hỏi của bạn, có lẽ bạn có thể thử các mã này:

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

Bạn có thể giải thích chính xác những gì định nghĩa đang làm? Nó trông gọn gàng, nhưng tôi không hiểu lắm. X Thường chỉ ra một macro dành riêng của Apple, trong khi PRETTY_FUNCTION chỉ ra thứ gì đó do người dùng tạo ra, do đó, kết quả thật khó hiểu
P i

2
xx là chuỗi định dạng, bạn có thể sử dụng bất cứ thứ gì bạn muốn, nếu nó giống hệt với chuỗi trước đó. Bạn có thể sử dụng FUNCTION , nhưng PRETTY_FUNCTION in tên phương thức Objective-C. liên kết này giải thích nó rất tốt.
Zitao Xiong
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.