Как говорится в вопросе, я бы хотел узнать, работает ли мой код в симуляторе, но также хотел бы знать, какая конкретная версия iphone запущена или имитируется.
РЕДАКТИРОВАТЬ: я добавил слово «программно» к названию вопроса. Суть моего вопроса в том, чтобы иметь возможность динамически включать / исключать код в зависимости от того, какая версия / симулятор запущена, поэтому я действительно искал бы что-то вроде директивы препроцессора, которая может предоставить мне эту информацию.
ios
objective-c
swift
xcode
ios-simulator
Джеффри Мейер
источник
источник
Ответы:
Уже спросил, но с совершенно другим названием.
Что #defines устанавливает Xcode при компиляции для iPhone
Я повторю свой ответ оттуда:
Он находится в документации SDK в разделе «Условная компиляция исходного кода»
Соответствующее определение - TARGET_OS_SIMULATOR, которое определено в /usr/include/TargetConditionals.h в рамках iOS. В более ранних версиях цепочки инструментов вы должны были написать:
но это больше не требуется в текущей (Xcode 6 / iOS8) цепочке инструментов.
Так, например, если вы хотите проверить, что вы работаете на устройстве, вы должны сделать
в зависимости от того, который подходит для вашего варианта использования.
источник
Обновленный код:
Это предполагается работать официально.
Исходное сообщение (поскольку устарело)
Этот код скажет вам, если вы работаете в симуляторе.
источник
Не директива препроцессора, но именно это я и искал, когда пришел к этому вопросу;
источник
[model compare:iPhoneSimulator] == NSOrderedSame
должно быть записано как[model isEqualToString:iPhoneSimulator]
[model hasSuffix:@"Simulator"]
если вы заботитесь только о «симуляторе» вообще, а не iPhone или iPad в частности. Этот ответ не будет работать для симулятора iPad :)name
вместо устройства проверьтеmodel
Simulator
слово в название своего устройстваЛучший способ сделать это:
и нет
так как его всегда определяется: 0 или 1
источник
ЛУЧШЕ ПУТЬ СЕЙЧАС!
Начиная с Xcode 9.3 beta 4 вы можете использовать
#if targetEnvironment(simulator)
для проверки.ОБНОВЛЕНИЕ
Xcode 10 и iOS 12 SDK также поддерживают это.
источник
В случае Swift мы можем реализовать следующее
Мы можем создать структуру, которая позволяет создавать структурированные данные
Тогда Если мы хотим определить, создается ли приложение для устройства или симулятора в Swift, тогда.
источник
#if #else #endif
будет лучше.Работает для
Swift 5
иXcode 11.3.1
Используйте этот код:
источник
Все эти ответы хороши, но это как-то сбивает с толку новичка, такого как я, поскольку не проясняет проверку компиляции и проверки во время выполнения. Препроцессор находится перед временем компиляции, но мы должны сделать его более понятным
В этой статье блога показано, как обнаружить симулятор iPhone? явно
время выполнения
Прежде всего, давайте кратко обсудим. UIDevice уже предоставляет вам информацию об устройстве
вернет вам «iPhone Simulator» или «iPhone» в зависимости от того, где запущено приложение.
Время компиляции
Однако вы хотите использовать определения времени компиляции. Зачем? Потому что вы компилируете свое приложение строго для запуска внутри Симулятора или на устройстве. Apple делает определение под названием
TARGET_IPHONE_SIMULATOR
. Итак, давайте посмотрим на код:источник
[[UIDevice currentDevice] model]
возвращаетсяiPhone
также вместоiPhone Simulator
. Так что я думаю, что это не лучший подход.Предыдущие ответы немного устарели. Я обнаружил, что все, что вам нужно сделать, это запросить
TARGET_IPHONE_SIMULATOR
макрос ( нет необходимости включать какие-либо другие заголовочные файлы [предполагается, что вы кодируете для iOS]).Я попытался,
TARGET_OS_IPHONE
но он вернул то же значение (1) при работе на реальном устройстве и симуляторе, поэтому я рекомендую использоватьTARGET_IPHONE_SIMULATOR
вместо этого.источник
В скором времени:
Из Определить, если приложение создается для устройства или симулятора в Swift
источник
У меня была одна и та же проблема, обе
TARGET_IPHONE_SIMULATOR
иTARGET_OS_IPHONE
всегда определены, и установлены на 1. Решение Пита, конечно, работает, но если вам когда-нибудь удастся использовать что-то отличное от Intel (маловероятно, но кто знает), вот что-то безопасное, как до тех пор, пока аппаратное обеспечение iphone не изменится (т. е. ваш код всегда будет работать для iphone, который в данный момент существует):Поместите это где-нибудь удобно, а затем сделайте вид, что
TARGET_*
константы были определены правильно.источник
Кто-нибудь рассматривал ответ, представленный здесь ?
Я полагаю, что объективный эквивалент эквивалентен
источник
Для Swift 4.2 / xCode 10
Я создал расширение на UIDevice, поэтому я могу легко спросить, работает ли симулятор.
Например, в моем AppDelegate я использую этот метод, чтобы решить, нужна ли регистрация для удаленного уведомления, что невозможно для симулятора.
источник
Включить все виды «симуляторов»
источник
-[NSString containsString]
?С Swift 4.2 (Xcode 10) мы можем сделать это
источник
Мой ответ основан на ответе @Daniel Magnusson и комментариях @Nuthatch и @ n.Drake. и я пишу это, чтобы сэкономить время для быстрых пользователей, работающих на iOS9 и далее.
Вот что сработало для меня:
источник
Simulator
слово в название своего устройстваUIDevice.current.name
сообщается имя машины, на которой запущен симулятор (обычно что-то вроде «Simon's MacBook Pro»), поэтому тест стал ненадежным. Я все еще ищу чистый способ исправить это./// Возвращает true, если его симулятор, а не устройство
источник
Apple добавила поддержку проверки приложения, предназначенного для симулятора, со следующим:
источник
если ничего не получилось, попробуйте это
источник
На мой взгляд, ответ (представлен выше и повторен ниже):
это лучший ответ, потому что он явно выполняется в RUNTIME, а не является COMPILE DIRECTIVE.
источник
Это сработало для меня лучше всего
источник
"iPhone"
.