Как программно определить, работает ли мое приложение в симуляторе iphone? - PullRequest
259 голосов
/ 19 января 2009

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

РЕДАКТИРОВАТЬ: я добавил слово «программно» к названию вопроса. Суть моего вопроса в том, чтобы иметь возможность динамически включать / исключать код в зависимости от того, какая версия / симулятор запущена, поэтому я действительно искал бы что-то вроде директивы препроцессора, которая может предоставить мне эту информацию.

Ответы [ 21 ]

349 голосов
/ 19 января 2009

Уже спросили, но с совершенно другим названием.

Какие #defines устанавливаются Xcode при компиляции для iPhone

Я повторю свой ответ оттуда:

Он находится в документации SDK в разделе «Условная компиляция исходного кода»

Соответствующее определение - TARGET_OS_SIMULATOR, которое определено в /usr/include/TargetConditionals.h в среде iOS. В более ранних версиях набора инструментов вы должны были написать:

#include "TargetConditionals.h"

но это больше не требуется для текущей (Xcode 6 / iOS8) цепочки инструментов.

Так, например, если вы хотите проверить, что вы работаете на устройстве, вы должны сделать

#if TARGET_OS_SIMULATOR
    // Simulator-specific code
#else
    // Device-specific code
#endif

в зависимости от того, что подходит для вашего варианта использования.

106 голосов
/ 19 января 2009

Обновленный код:

Официально предполагается, что он будет работать.

#if TARGET_IPHONE_SIMULATOR
NSString *hello = @"Hello, iPhone simulator!";
#elif TARGET_OS_IPHONE
NSString *hello = @"Hello, device!";
#else
NSString *hello = @"Hello, unknown target!";
#endif

Оригинальный пост (поскольку устарел)

Этот код сообщит вам, работаете ли вы в симуляторе.

#ifdef __i386__
NSLog(@"Running in the simulator");
#else
NSLog(@"Running on a device");
#endif
61 голосов
/ 18 августа 2010

Не директива препроцессора, но это было то, что я искал, когда пришел к этому вопросу;

NSString *model = [[UIDevice currentDevice] model];
if ([model isEqualToString:@"iPhone Simulator"]) {
    //device is simulator
}
54 голосов
/ 07 марта 2011

Лучший способ сделать это:

#if TARGET_IPHONE_SIMULATOR

а не

#ifdef TARGET_IPHONE_SIMULATOR

, поскольку всегда определяется: 0 или 1

31 голосов
/ 25 февраля 2016

В случае Swift мы можем реализовать следующее

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

struct Platform {
    static let isSimulator: Bool = {
        #if arch(i386) || arch(x86_64)
            return true
        #endif
        return false
    }()
}

Тогда Если мы хотим определить, создается ли приложение для устройства или симулятора в Swift, тогда

if Platform.isSimulator {
    // Do one thing
}
else {
    // Do the other
}
30 голосов
/ 12 марта 2018

ЛУЧШЕ СЕЙЧАС!

Начиная с Xcode 9.3 beta 4, вы можете использовать #if targetEnvironment(simulator) для проверки.

#if targetEnvironment(simulator)
//Your simulator code
#endif

UPDATE
Xcode 10 и iOS 12 SDK также поддерживают это.

8 голосов
/ 17 июня 2014

Все эти ответы хороши, но это как-то сбивает с толку новичка, такого как я, поскольку не проясняет проверки компиляции и проверки во время выполнения. Препроцессор находится перед временем компиляции, но мы должны сделать его более понятным

Эта статья блога показывает Как обнаружить симулятор iPhone? четко

Продолжительность

Прежде всего, давайте кратко обсудим. UIDevice уже предоставляет вам информацию об устройстве

[[UIDevice currentDevice] model]

вернет вам «iPhone Simulator» или «iPhone» в зависимости от того, где работает приложение.

Время компиляции

Однако вы хотите использовать определения времени компиляции. Зачем? Потому что вы компилируете свое приложение строго для запуска внутри Симулятора или на устройстве. Apple делает определение под названием TARGET_IPHONE_SIMULATOR. Итак, давайте посмотрим на код:

#if TARGET_IPHONE_SIMULATOR

NSLog(@"Running in Simulator - no app store or giro");

#endif
6 голосов
/ 18 июля 2018

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

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

#if targetEnvironment(simulator)
   // Simulator
#else
   // Device
#endif
6 голосов
/ 16 июня 2016
6 голосов
/ 21 мая 2013

Предыдущие ответы немного устарели. Я обнаружил, что все, что вам нужно сделать, это запросить макрос TARGET_IPHONE_SIMULATOR ( не нужно включать другие заголовочные файлы [при условии, что вы кодируете для iOS]).

Я попытался TARGET_OS_IPHONE, но он вернул то же значение (1) при работе на реальном устройстве и симуляторе, поэтому я рекомендую использовать TARGET_IPHONE_SIMULATOR вместо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...