Как проверить, запущено ли приложение на устройстве iOS или симуляторе в Delphi XE6

На основе этой ссылки Условная компиляция (Delphi) CPUARM условно если должно быть ложным для симулятора и истинным для устройства, проблема в том, что он не работает для меня. Я использую Delphi XE6, iOS Simulator 7.1

это мой код

    {$IFDEF CPUARM}
s := 'iOS device';
    {$ELSE}
s := 'iOS Simulator';
    {$ENDIF}

PS Симулятор iOS работает на виртуальной машине VMWare.


person Reza    schedule 22.05.2014    source источник
comment
Вы должны всегда добавлять общий тег delphi к вопросам, связанным с Delphi. Может быть, вы были удивлены низким вниманием к вашим вопросам. Вот причина :о)   -  person Sir Rufo    schedule 22.05.2014
comment
@SirRufo Спасибо, чувак;)   -  person Reza    schedule 22.05.2014
comment
@RobKennedy, на самом деле нет. Симулятор iOS не запускает тот же двоичный файл, который развернут на устройствах iOS. Симулятор запускает скомпилированный код x86, а не скомпилированный код ARM. Так что это не единичный сборник. Проверка CPUARM — это правильный способ отличить устройство iOS от симулятора iOS.   -  person Remy Lebeau    schedule 22.05.2014


Ответы (2)


Проверка на CPUARM является правильным решением. Бинарные файлы iOS, скомпилированные для симулятора, не являются ARM, они на самом деле x86. Просто убедитесь, что код iOS заключен в {$IFDEF IOS}:

{$IFDEF IOS}
  {$IFDEF CPUARM}
s := 'iOS device';
  {$ELSE}
s := 'iOS Simulator';
  {$ENDIF}
{$ENDIF}

Delphi использует компилятор ARM для устройств iOS, но использует компилятор x86 для симулятора iOS.

Доступные условия компилятора задокументированы в DocWiki Embarcadero:

Условная компиляция (Delphi) | Предопределенные условия

CPUARM определяется компилятором DCCIOSARM (устройство iOS).

CPU386 и CPUX86 определяются компилятором DCCIOS32 (симулятор iOS) .

Взгляд на условные значения, которые физически присутствуют в исполняемых файлах XE6 DCCIOSARM.EXE и DCCIOS32.EXE, подтверждает следующее:

DCCIOSARM.EXE:

**CPUARM**
DCC
NEXTGEN
AUTOREFCOUNT
WEAKINSTREF
WEAKINTFREF
WEAKREF
EXTERNALLINKER
NATIVECODE
POSIX
POSIX32
MACOS
MACOS32
**IOS**
VER270
CONSOLE
BCB
PIC
UNICODE
CONDITIONALEXPRESSIONS

DCCIOS32.EXE:

**CPU386**
**CPUX86**
DCC
NEXTGEN
AUTOREFCOUNT
WEAKINSTREF
WEAKINTFREF
WEAKREF
NATIVECODE
POSIX
POSIX32
MACOS
MACOS32
**IOS**
ALIGN_STACK
UNDERSCOREIMPORTNAME
PC_MAPPED_EXCEPTIONS
ASSEMBLER
VER270
CONSOLE
BCB
PIC
UNICODE
CONDITIONALEXPRESSIONS
person Remy Lebeau    schedule 22.05.2014
comment
Я проверил документацию и использовал CPUARM и IOS, как вы пишете, но на удивление это не сработало. - person Reza; 23.05.2014
comment
Уверяю вас, так и есть. Невозможно определить CPUARM при компиляции для симулятора iOS, если что-то еще в вашем проекте не определяет его вручную. Как видно из моего ответа, CPUARM физически не существует в DCCIOS32. - person Remy Lebeau; 23.05.2014

Я нашел обходной путь для этой проблемы:

Я определил условие ISSIM для ALL Configuration - IOS Simulator Platform на странице Project->Options, затем я проверил это с помощью этого

    {$IFDEF ISSIM}
s := 'iOS Simulator';
    {$ELSE}
s := 'iOS device';
    {$ENDIF}

введите здесь описание изображения

person Reza    schedule 22.05.2014
comment
Нет необходимости определять собственное значение, достаточно существующих условий компилятора. - person Remy Lebeau; 22.05.2014