Программно определять, запускается ли приложение на устройстве или симуляторе

Я хотел бы знать, выполняется ли мое приложение на устройстве или симуляторе во время выполнения. Есть ли способ это обнаружить?

Причина в том, чтобы протестировать API Bluetooth с помощью симулятора: http://volcore.limbicsoft.com/2009/09/iphone-os-31-gamekit-pt-1-woooohooo.html


person eugene    schedule 25.04.2011    source источник
comment
Нет необходимости проверять это во время выполнения, просто используйте определение TARGET_IPHONE_SIMULATOR, чтобы отличить этот случай от случая, выполняемого на устройстве.   -  person Till    schedule 25.04.2011


Ответы (8)


#if TARGET_OS_SIMULATOR

//Simulator

#else

// Device

#endif

Пожалуйста, обратитесь к этому предыдущему вопросу SO, также Какие # определения установлены вверх с помощью Xcode при компиляции для iPhone

person visakh7    schedule 25.04.2011
comment
Обратите внимание, что это макросы времени компиляции и недоступны во время выполнения. - person Eric; 02.08.2012
comment
#include TargetConditionals.h // если ваш источник находится в c - person Scott Stensland; 17.11.2012
comment
Есть ли у посетителей StackOverflow проблемы с пониманием прочитанного? Вопрос состоял в том, чтобы задать различие во время выполнения, а не во время компиляции! Правильный ответ - макрос SIM-карты Фернандо Сервантеса, а не этот. Тем не менее, на момент написания этого комментария у этого неправильного ответа было 32 балла, а у правильного - только 3. - person StCredZero; 29.10.2013
comment
@StCredZero. - person Johan Kool; 17.03.2014
comment
@JohanKool В некоторых случаях это имеет значение, например, если вы пишете статическую библиотеку, которая используется в приложениях других людей. У вас нет роскоши проверки во время компиляции, потому что ваш код уже скомпилирован. Итак, ваш чек должен быть во время выполнения. Показательный пример: включение сообщения с предупреждением для разработчика об этой ошибке симулятора Xcode 8: forum.developer. apple.com/message/179846 - person Rizwan Sattar; 03.10.2016
comment
@RizwanSattar В этом нет никакого смысла. В любом случае вам нужно скомпилировать две версии библиотеки. Один предназначен для симулятора, в котором используется архитектура, отличная от архитектуры физических устройств. Это правильный ответ. - person Agop; 18.01.2017

Я создал макрос, в котором вы можете указать, какие действия вы хотите выполнить, в круглых скобках, и эти действия будут выполняться только в том случае, если устройство моделируется.

#define SIM(x) if ([[[UIDevice currentDevice].model lowercaseString] rangeOfString:@"simulator"].location != NSNotFound){x;}

Это используется так:

SIM(NSLog(@"This will only be logged if the device is simulated"));
person Fernando Cervantes    schedule 29.03.2012
comment
Свойство model UIDevice не содержит simulator слова из iOS 9 - person mbelsky; 09.05.2016

TARGET_IPHONE_SIMULATOR определен на устройстве (но определен как false). и определяется как ниже

#if TARGET_IPHONE_SIMULATOR
NSString * const DeviceMode = @"Simulator";
#else
NSString * const DeviceMode = @"Device";
#endif

Просто используйте DeviceMode, чтобы узнать между устройством и симулятором

person Jhaliya - Praveen Sharma    schedule 25.04.2011

Проверьте, есть ли симулятор

#if TARGET_IPHONE_SIMULATOR
// Simulator
#endif

Проверьте, есть ли устройство

#if !(TARGET_IPHONE_SIMULATOR)
// Device
#endif

Проверьте оба

#if TARGET_IPHONE_SIMULATOR
// Simulator
#else
// Device
#endif

Обратите внимание, что вам не следует ifdef на TARGET_IPHONE_SIMULATOR, потому что он всегда будет определяться как 1 или 0.

person hfossli    schedule 11.09.2014
comment
Большое тебе спасибо! ifdef это зло) - person Nikolay Shubenkov; 04.10.2016

Начиная с XCode 9.3+, Swift

#if targetEnvironment(simulator)
//Simulator
#else
//Real device
#endif

Помогает вам кодировать в зависимости от типа устройства.

person theapache64    schedule 30.04.2018
comment
Этот новый макрос предназначен только для быстрого: developer.apple.com/library/content/releasenotes/DeveloperTools/ - person stonedauwg; 11.05.2018
comment
Да, я забыл об этом упомянуть. Сообщение отредактировано. tnx @stonedauwg - person theapache64; 11.05.2018

Вы можете использовать макрос препроцессора TARGET_IPHONE_SIMULATOR, чтобы различать цели устройства и симулятора.

person Julio Gorgé    schedule 25.04.2011

Используйте этот код ниже:

#if targetEnvironment(simulator)
   // iOS Simulator
#else
   // Device
#endif

Работает для Swift 4 и Xcode 9.4.1

person Haroldo Gondim    schedule 18.07.2018

Если кто-то ищет Unity решение, я сделал это, единственный способ, который я нашел, как это сделать.

using System.Globalization;

public static bool IsArm() {
        return CultureInfo.InvariantCulture.CompareInfo.IndexOf(SystemInfo.processorType, "ARM", CompareOptions.IgnoreCase) >= 0;
    }
person tsukimi    schedule 18.06.2020