如何检查应用程序是否在iOS设备或模拟器上运行

7
基于此链接条件编译(Delphi),CPUARM条件如果应该为模拟器为false,设备为true,但问题是对我不起作用。 我正在使用Delphi XE6,iOS模拟器7.1

这是我的代码

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

p.s iOS模拟器正在运行在VMWare虚拟机中。


1
你应该始终在与Delphi相关的问题中添加常见的 delphi 标签。也许你曾经想知道为什么你的问题没有引起更多的关注。这就是原因 :o) - Sir Rufo
@SirRufo 谢谢老兄 ;) - Reza
2
@RobKennedy,实际上并不是这样。iOS模拟器不会运行部署到iOS设备的相同二进制文件。模拟器运行的是x86编译代码,而不是ARM编译代码。所以这不是单一的编译。检查CPUARM是区分iOS设备和iOS模拟器的正确方式。 - Remy Lebeau
2个回答

9

检查CPUARM是正确的解决方案。为模拟器编译的iOS二进制文件不是ARM,而实际上是x86。只需确保用{$IFDEF IOS}包装您的iOS代码:

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

Delphi在iOS设备上使用ARM编译器,但在iOS模拟器上使用x86编译器。

Embarcadero的DocWiki上记录了可用的编译器条件:

条件编译(Delphi)|预定义条件

CPUARMDCCIOSARM编译器(iOS设备)定义。

CPU386CPUX86DCCIOS32编译器(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

更新:从 Delphi 11.2 开始,基于 ARM 的 iOS 模拟器现在通过新的 DCCIOSSIMARM64 编译器得到支持。您可以使用 IOSSIMULATOR 条件来检查该编译器:

{$IFDEF IOS}
  {$IFDEF CPUARM}
    {$IFDEF IOSSIMULATOR}
s := 'iOS Simulator (ARM)';
    {$ELSE}
s := 'iOS device';
    {$ENDIF}
  {$ELSE}
s := 'iOS Simulator (x86)';
  {$ENDIF}
{$ENDIF}

我已经查看了文档,按照您的要求使用了CPUARM和IOS,但令人惊讶的是它并没有起作用。 - Reza
我向您保证,它是这样的。除非您的项目中有其他内容手动定义了它,否则在编译iOS模拟器时不可能定义CPUARM。正如您在我的答案中所看到的那样,CPUARM在DCCIOS32中并不存在。 - Remy Lebeau
“在编译iOS模拟器时,不可能定义CPUARM” - 但是从Delphi 11.2开始,情况已经改变。通过新的DCCIOSSIMARM64编译器,支持基于ARM的模拟器。我已经更新了我的答案。” - Remy Lebeau

-1
我找到了解决这个问题的方法:
我在“项目->选项”页面中为“所有配置-IOS模拟器平台”定义了一个“ISSIM”条件,然后通过这个条件进行了检查。
    {$IFDEF ISSIM}
s := 'iOS Simulator';
    {$ELSE}
s := 'iOS device';
    {$ENDIF}

enter image description here


不必定义自己的值,现有的编译器条件已经足够。 - Remy Lebeau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接