Ответы на этот вопрос не совсем верны. Вопрос о платформе и оборудовании против симулятора является ортогональным.
Не используйте архитектуру в качестве ярлыка для обнаружения платформы или симулятора! Такое неаккуратное мышление на протяжении многих лет вызывало у многих и многих программистов изжогу и головную боль.
Вот диаграмма ASCII условных выражений. Имена не обязательно имеют смысл по историческим причинам:
+--------------------------------------+
| TARGET_OS_MAC |
| +---+ +---------------------------+ |
| | | | TARGET_OS_IPHONE | |
| |OSX| | +-----+ +----+ +-------+ | |
| | | | | IOS | | TV | | WATCH | | |
| | | | +-----+ +----+ +-------+ | |
| +---+ +---------------------------+ |
+--------------------------------------+
Devices: TARGET_OS_EMBEDDED
Simulators: TARGET_OS_SIMULATOR
TARGET_OS_MAC верно для всех платформ Apple.
TARGET_OS_OSX верно только для macOS
TARGET_OS_IPHONE верно для iOS, watchOS и tvOS (устройства и симуляторы)
TARGET_OS_IOS верно только для iOS (устройства и симуляторы)
TARGET_OS_WATCH верно только для watchOS (устройства и симуляторы)
TARGET_OS_TV верно только для tvOS (устройства и симуляторы)
TARGET_OS_EMBEDDED верно только для iOS / watchOS / tvOS
TARGET_OS_SIMULATOR верно только для симулятора.
Также отмечу, что вы можете обусловить настройки в xcconfig
файлах по платформам:
//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*] = ...