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

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


当前回答

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

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

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

其他回答

在Swift的情况下,我们可以实现以下

我们可以创建struct,它允许你创建结构化数据

struct Platform {
    static var isSimulator: Bool {
        #if targetEnvironment(simulator)
            // We're on the simulator
            return true
        #else
            // We're on a device
             return false
        #endif
    }
}

然后,如果我们想检测应用程序是否正在构建的设备或模拟器在Swift然后。

if Platform.isSimulator {
    // Do one thing
} else {
    // Do the other
}

之前的答案有点过时了。我发现所有你需要做的是查询TARGET_IPHONE_SIMULATOR宏(不需要包括任何其他头文件[假设你是为iOS编码])。

我尝试了TARGET_OS_IPHONE,但它在实际设备和模拟器上运行时返回相同的值(1),这就是为什么我建议使用TARGET_IPHONE_SIMULATOR代替。

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

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

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

我的回答是基于@Daniel Magnusson的回答和@Nuthatch和@n.Drake的评论。我写它是为了为在iOS9及以后的系统上快速工作的用户节省一些时间。

这对我来说很管用:

if UIDevice.currentDevice().name.hasSuffix("Simulator"){
    //Code executing on Simulator
} else{
    //Code executing on Device
}

如果没有效果,试试这个

public struct Platform {

    public static var isSimulator: Bool {
        return TARGET_OS_SIMULATOR != 0 // Use this line in Xcode 7 or newer
    }

}