2012-01-30 33 views
186

Tôi đang tạo ứng dụng xử lý dữ liệu thẻ tín dụng nhạy cảm.Xcode/iOS: Cách xác định xem mã có đang chạy trong DEBUG/RELEASE build không?

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

Tuy nhiên trên phiên bản appstore cuối cùng (tức là khi nó đang chạy ở chế độ phát hành), điều quan trọng là tất cả điều này 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ể; do đó, câu hỏi trở thành 'Con đường giải pháp này là đúng hay cách 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 

Trả lời

218

Kiểm tra cài đặt xây dựng của dự án của bạn dưới 'của Apple LVM - tiền xử lý', 'Preprocessor Macros' cho gỡ lỗi để đảm bảo rằng 'DEBUG' đang được đặt - thực hiện việc này bằng cách chọn dự án và nhấp vào tab cài đặt xây dựng. Tìm kiếm 'DEBUG' và tìm xem liệu thực sự DEBUG có được đặt hay không.

Chú ý. Bạn có thể thấy DEBUG đã thay đổi thành một tên biến khác như DEBUG_MODE.

Build Settings tab of my project settings

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

#ifdef DEBUG 

// Something to log your sensitive data here 

#else 

// 

#endif 
+0

Thanx cho câu trả lời của bạn, nếu tôi cố gắng làm như thế này: '#ifdef DEBUG NSLog @ (" Cái gì đó "); # 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ì đó để bàn điều khiển xin vui lòng, bạn có thể chỉnh sửa câu hỏi của bạn? – Malloc

+2

Nó sẽ hoạt động. Tại sao không đăng câu hỏi mới với một số mã? – Damo

+1

Damo, cảm ơn người đàn ông, làm những việc lớn từ LPharma ;-) –

2

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

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

Bạn có thể giải thích chính xác những gì định nghĩa đang làm không? Nó trông gọn gàng, nhưng tôi không hiểu lắm. __X__ Thường chỉ báo macro được Apple dành riêng, trong khi PRETTY_FUNCTION cho biết người dùng đã tạo ra, do đó kết quả gây nhầm lẫn –

+2

xx là chuỗi định dạng, bạn có thể sử dụng bất kỳ thứ gì bạn muốn, nếu nó giống 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. [link] (http://stackoverflow.com/questions/300673/is-it-true-that-one-should-not-use-nslog-on-production-code) giải thích nó rất tốt. –

85

của Apple đã bao gồm một lá cờ DEBUG trong debug xây dựng, do đó bạn không cần định nghĩa của riêng bạn.

Bạn cũng có thể muốn xem xét chỉ xác định lại NSLog đến một hoạt động null khi không ở chế độ DEBUG, cách mà mã của bạn sẽ được cầm tay hơn và bạn chỉ có thể sử dụng thường xuyên NSLog báo cáo:

//put this in prefix.pch 

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

zitao xiong của câu trả lời là 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 FILE).

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

Để biết giải pháp trong Swift, vui lòng tham khảo this thread trên SO.

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

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

Bên cạnh đó bạn sẽ cần phải thiết lập các biểu tượng DEBUG trong Swift Compiler - Custom Flags phần cho Other Swift Flags chìa khóa thông qua một entry -D DEBUG. Xem ảnh chụp màn hình sau đây cho một ví dụ:

enter image description here

+2

Cảm ơn nó đã làm việc cho tôi, tôi đã mất tích "-D DEBUG" :) – Nitesh

+1

Tôi tìm Swift Compiler - Custom Flags ở đâu? – confile

+2

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

6

Trong xcode 7, có một trường bên dưới của Apple LLVM 7.0 - tiền xử lý, mà gọi là "preprocessors Macros không được sử dụng Trong precompiled ... " tôi đặt DEBUG trước gỡ lỗi và nó làm việc cho 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 
12

Hầu hết các câu trả lời cho biết rằng làm thế nào để thiết lập DEBUG #ifdef và không ai trong số họ nói như thế nào để quy debug/phát hành

ý kiến ​​của tôi xây dựng:

  1. chỉnh sửa chương trình -> chạy -> xây dựng cấu hình:.. chọn debug/release Nó có thể kiểm soát trình mô phỏng và trạng thái mã của iPhone thử nghiệm của bạn.

  2. Chỉnh sửa lược đồ -> lưu trữ -> cấu hình xây dựng: 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. enter image description here

+0

Cảm ơn bạn! Đó là lý do tại sao tôi duyệt ở đây. Tôi googled cho "làm thế nào để kiểm tra phiên bản phát hành của ứng dụng của tôi trong nhanh chóng?" – Neo42

1

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

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 

quảng cáo d vào tập tin cầu tiêu đề:

#include "DebugMode.h"

sử dụng:

DebugMode.isDebug()

Nó không phải là cần thiết để viết một cái gì đó bên trong thuộc tính dự án cờ nhanh chóng.

Các vấn đề liên quan