我怎样才能以编程方式确定我的应用程序是否在iphone模拟器中运行?

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

编辑:我添加了单词“编程”的问题名称。 我的问题的关键是能够dynamic地包括/排除代码取决于哪个版本/模拟器正在运行,所以我真的在寻找像预处理器指令,可以提供给我这个信息的东西。

已经问过,但是标题非常不同。

Xcode编译iPhone时设置了什么#defines

我会从那里重复我的答案:

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

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

#include "TargetConditionals.h" 

但是现在(Xcode 6 / iOS8)工具链不再需要这个function。

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

 #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 } 

最好的办法是:

 #if TARGET_IPHONE_SIMULATOR 

并不是

 #ifdef TARGET_IPHONE_SIMULATOR 

因为它总是定义为:0或1

在Swift的情况下,我们可以执行以下操作

我们可以创build一个结构,它允许你创build一个结构化的数据

 struct Platform { static let isSimulator: Bool = { #if arch(i386) || arch(x86_64) return true #endif return false }() } 

然后,如果我们想要检测,如果应用程序正在build立设备或模拟器在斯威夫特然后。

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

所有这些答案都是好的,但它不知道像我这样的新手,因为它不澄清编译检查和运行时检查。 预处理器在编译之前,但我们应该更清楚

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

运行

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

 [[UIDevice currentDevice] model] 

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

编译时间

然而你想要的是使用编译时定义。 为什么? 因为您严格编译应用程序以在模拟器或设备中运行。 苹果公司做了一个名为TARGET_IPHONE_SIMULATOR的定义。 那么让我们来看一下代码:

 #if TARGET_IPHONE_SIMULATOR NSLog(@"Running in Simulator - no app store or giro"); #endif 

我有同样的问题, TARGET_IPHONE_SIMULATORTARGET_OS_IPHONE总是定义,并设置为1.皮特的解决scheme,当然,但如果你曾经发生build立在英特尔以外(不太可能,但谁知道),这是什么只要iphone的硬件没有改变(所以你的代码将永远为当前在那里的iPhone手机):

 #if defined __arm__ || defined __thumb__ #undef TARGET_IPHONE_SIMULATOR #define TARGET_OS_IPHONE #else #define TARGET_IPHONE_SIMULATOR 1 #undef TARGET_OS_IPHONE #endif 

把那个方便的地方,然后假装TARGET_*常量被正确定义。

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

我尝试了TARGET_OS_IPHONE但是它在实际的设备和模拟器上运行时返回了相同的值(1),这就是我推荐使用TARGET_IPHONE_SIMULATOR的原因。

在迅速:

 #if (arch(i386) || arch(x86_64)) ... #endif 

从检测如果应用程序正在build立设备或模拟器在Swift中

要包括所有types的“模拟器”

 NSString *model = [[UIDevice currentDevice] model]; if([model rangeOfString:@"Simulator" options:NSCaseInsensitiveSearch].location !=NSNotFound) { // we are running in a simulator } 

我的回答是基于@Daniel Magnusson的回答以及@Nuthatch和@ n.Drake的评论。 我写这个文件是为了节省一些在iOS9及更高版本上工作的用户。

这对我来说是有效的:

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

有没有人考虑过这里提供的答案?

我想这个objective-c相当于是

 + (BOOL)isSimulator { NSOperatingSystemVersion ios9 = {9, 0, 0}; NSProcessInfo *processInfo = [NSProcessInfo processInfo]; if ([processInfo isOperatingSystemAtLeastVersion:ios9]) { NSDictionary<NSString *, NSString *> *environment = [processInfo environment]; NSString *simulator = [environment objectForKey:@"SIMULATOR_DEVICE_NAME"]; return simulator != nil; } else { UIDevice *currentDevice = [UIDevice currentDevice]; return ([currentDevice.model rangeOfString:@"Simulator"].location != NSNotFound); } } 

在我看来,答案(上面和下面重复):

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

是最好的答案,因为它显然是在运行时执行,而不是一个COMPILE DIRECTIVE。

这对我来说效果最好

 NSString *name = [[UIDevice currentDevice] name]; if ([name isEqualToString:@"iPhone Simulator"]) { }