Câu trả lời cho câu hỏi này không hoàn toàn chính xác. Câu hỏi của nền tảng và phần cứng vs Simulator là trực giao.
Không sử dụng kiến trúc làm phím tắt để phát hiện nền tảng hoặc trình mô phỏng! Đây là loại suy nghĩ cẩu thả đã gây ra nhiều, nhiều lập trình viên rất nhiều chứng ợ nóng và đau đầu trong những năm qua.
Dưới đây là biểu đồ ASCII về các điều kiện. Các tên không nhất thiết có ý nghĩa vì những lý do lịch sử:
+--------------------------------------+
| TARGET_OS_MAC |
| +---+ +---------------------------+ |
| | | | TARGET_OS_IPHONE | |
| |OSX| | +-----+ +----+ +-------+ | |
| | | | | IOS | | TV | | WATCH | | |
| | | | +-----+ +----+ +-------+ | |
| +---+ +---------------------------+ |
+--------------------------------------+
Devices: TARGET_OS_EMBEDDED
Simulators: TARGET_OS_SIMULATOR
TARGET_OS_MAC là đúng cho tất cả các nền tảng của Apple.
TARGET_OS_OSX là đúng chỉ dành cho hệ điều hành MacOS
TARGET_OS_IPHONE là đúng đối với iOS, watchos, và tvOS (thiết bị & mô phỏng)
TARGET_OS_IOS là đúng chỉ dành cho iOS (thiết bị & mô phỏng)
TARGET_OS_WATCH chỉ đúng cho watchOS (thiết bị & trình mô phỏng)
TARGET_OS_TV chỉ đúng cho tvOS (thiết bị & mô phỏng)
TARGET_OS_EMBEDDED chỉ đúng cho phần cứng iOS/watchos/tvOS
TARGET_OS_SIMULATOR chỉ đúng cho Simulator.
tôi cũng sẽ lưu ý rằng bạn có thể thiết lập conditionalize trong xcconfig
file theo nền tảng:
//macOS only
SOME_SETTING[sdk=macosx] = ...
//iOS (device & simulator)
SOME_SETTING[sdk=iphone*] = ...
//iOS (device)
SOME_SETTING[sdk=iphoneos*] = ...
//iOS (simulator)
SOME_SETTING[sdk=iphonesimulator*] = ...
//watchOS (device & simulator)
SOME_SETTING[sdk=watch*] = ...
//watchOS (device)
SOME_SETTING[sdk=watchos*] = ...
//watchOS (simulator)
SOME_SETTING[sdk=watchsimulator*] = ...
//tvOS (device & simulator)
SOME_SETTING[sdk=appletv*] = ...
//tvOS (device)
SOME_SETTING[sdk=appletvos*] = ...
//tvOS (simulator)
SOME_SETTING[sdk=appletvsimulator*] = ...
// iOS, tvOS, or watchOS Simulator
SOME_SETTING[sdk=embeddedsimulator*] = ...
bao gồm điều kiện mục tiêu được chính xác điều đúng đắn, sau đó sử dụng #ifdef TARGET_OS_IPHONE – kritzikratzi
@kritzikratzi: #ifdef là sai rồi; bạn phải sử dụng #if. (Biểu tượng thường được định nghĩa là 0 khi không có trên trình mô phỏng; #ifdef sẽ vẫn đúng.) – Andrew
Đối với những người bạn cũng nghĩ TARGET_OS_IPHONE là một cách phát hiện thiết bị, nó không phải. Nó có nghĩa là bạn đang trên iOS, có thể là giả lập hoặc iphone. TARGET_IPHONE_SIMULATOR là cách phát hiện thiết bị so với trình mô phỏng. (Tôi biết nó không ngụ ý trong câu trả lời nhưng nhìn thấy IPHONE ở đó dẫn đến lỗi của tôi) –