正如问题所述,我主要想知道我的代码是否在模拟器中运行,但也有兴趣知道正在运行或正在模拟的特定iphone版本。

编辑:我在问题名称中添加了“以编程方式”这个词。我的问题的要点是能够动态包括/排除代码取决于哪个版本/模拟器正在运行,所以我真的在寻找像一个预处理程序指令,可以为我提供这个信息。


当前回答

所有这些答案都很好,但它在某种程度上让像我这样的新手感到困惑,因为它没有阐明编译检查和运行时检查。预处理器在编译之前,但我们应该更清楚

这篇博客文章展示了如何检测iPhone模拟器?很明显

运行时

首先,让我们简单讨论一下。UIDevice已经为您提供了有关设备的信息

[[UIDevice currentDevice] model]

将根据应用程序运行的位置返回“iPhone模拟器”或“iPhone”。

编译时

但是,您需要的是使用编译时定义。为什么?因为你严格编译你的应用程序,要么在模拟器中运行,要么在设备上运行。苹果做了一个叫做TARGET_IPHONE_SIMULATOR的定义。让我们看一下代码:

#if TARGET_IPHONE_SIMULATOR

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

#endif

其他回答

这对我来说是最有效的

NSString *name = [[UIDevice currentDevice] name];


if ([name isEqualToString:@"iPhone Simulator"]) {

}

Swift现在有了更好的方式。

从Xcode 9.3及更新版本开始,你可以使用#if targetEnvironment(模拟器)来检查。

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

我已经问过了,但题目完全不同。

Xcode在为iPhone编译时设置了什么#定义

我将重复我的回答:

在SDK文档中的“有条件地编译源代码”

相关的定义是TARGET_OS_SIMULATOR,它在iOS框架中的/usr/include/ targetconditions .h中定义。在工具链的早期版本中,你必须这样写:

#include "TargetConditionals.h"

但在当前(Xcode 6/iOS8)的工具链中,这不再是必要的。

例如,如果你想检查你是否在设备上运行,你应该这样做

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

这取决于哪个适合您的用例。

更新后的代码:

官方声称这是有效的。

#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

在我看来,答案(如上所述,下文重复):

NSString *model = [[UIDevice currentDevice] model];
if ([model isEqualToString:@"iPhone Simulator"]) {
    //device is simulator
}

是最好的答案,因为它显然是在RUNTIME执行,而不是作为一个COMPILE指令。