2014-05-22 1 views
4

Basé sur ce lien Conditional compilation (Delphi) CPUARM conditionnel si doit être faux pour Simulator et vrai pour l'appareil, le problème est que ça ne fonctionne pas pour moi. J'utilise Delphi XE6, iOS Simulator 7.1Comment vérifier si l'application fonctionne sur un appareil iOS ou un simulateur dans Delphi XE6

Ceci est mon code

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

p.s iOS Simulator est en cours d'exécution dans une machine virtuelle VMWare.

+1

Vous devez toujours ajouter la balise 'delphi' commune à vos questions relatives à Delphi. Peut-être que vous vous demandiez la faible attention accordée à vos questions. C'est la raison: o) –

+0

@SirRufo Merci mec;) – RezaRahmati

+2

@RobKennedy, en fait, non. Le simulateur iOS n'exécute pas le même fichier binaire que celui qui est déployé sur les appareils iOS. Le simulateur exécute le code compilé x86, pas le code compilé ARM. Ce n'est donc pas une compilation unique. La vérification de CPUARM est la manière correcte de différencier un appareil iOS et un simulateur iOS. –

Répondre

-1

J'ai trouvé une solution à ce problème:

je définissais une condition ISSIM pour ALL Configuration - IOS Simulator Platform dans Project-> Options, puis je vérifie que via ce

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

enter image description here

+0

Il n'est pas nécessaire de définir votre propre valeur, les conditions de compilation existantes sont suffisantes. –

4

Vérification des CPUARM est la bonne solution. Les binaires iOS compilés pour le simulateur ne sont pas ARM, ils sont en fait x86. Assurez-vous d'envelopper votre code iOS avec {$IFDEF IOS}:

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

Delphi utilise un compilateur ARM pour les appareils iOS, mais utilise un compilateur x86 pour le simulateur iOS.

Les conditionals du compilateur disponibles sont documentés sur docwiki Embarcadero:

Conditional compilation (Delphi) | Predefined Conditionals

CPUARM est défini par le DCCIOSARM compiler (iOS).

CPU386 et CPUX86 sont définis par le DCCIOS32 compiler (simulateur iOS).

Un regard sur les valeurs conditionnelles qui sont physiquement présents dans les fichiers exécutables DCCIOSARM.EXE et DCCIOS32.EXE de XE6 confirme que:

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 
+0

J'avais vérifié la documentation et j'ai utilisé CPUARM et IOS pendant que vous écrivez, mais étonnamment cela n'a pas fonctionné. – RezaRahmati

+0

Je vous assure, c'est le cas. Il est impossible de définir 'CPUARM' lors de la compilation pour le simulateur iOS, à moins que quelque chose d'autre dans votre projet ne le définisse manuellement. Comme vous pouvez le voir dans ma réponse, 'CPUARM' n'existe pas physiquement dans DCCIOS32. –

Questions connexes