我怎样才能以编程方式确定我的应用程序是否在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_SIMULATOR
和TARGET_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_SIMULATOR
macros( 不需要包含任何其他的头文件 [假设你正在为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"]) { }