正如问题所述,我主要想知道我的代码是否在模拟器中运行,但也有兴趣知道正在运行或正在模拟的特定iphone版本。
编辑:我在问题名称中添加了“以编程方式”这个词。我的问题的要点是能够动态包括/排除代码取决于哪个版本/模拟器正在运行,所以我真的在寻找像一个预处理程序指令,可以为我提供这个信息。
正如问题所述,我主要想知道我的代码是否在模拟器中运行,但也有兴趣知道正在运行或正在模拟的特定iphone版本。
编辑:我在问题名称中添加了“以编程方式”这个词。我的问题的要点是能够动态包括/排除代码取决于哪个版本/模拟器正在运行,所以我真的在寻找像一个预处理程序指令,可以为我提供这个信息。
当前回答
之前的答案有点过时了。我发现所有你需要做的是查询TARGET_IPHONE_SIMULATOR宏(不需要包括任何其他头文件[假设你是为iOS编码])。
我尝试了TARGET_OS_IPHONE,但它在实际设备和模拟器上运行时返回相同的值(1),这就是为什么我建议使用TARGET_IPHONE_SIMULATOR代替。
其他回答
更新后的代码:
官方声称这是有效的。
#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
有人考虑过这里提供的答案吗?
我想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);
}
}
我有同样的问题,TARGET_IPHONE_SIMULATOR和TARGET_OS_IPHONE总是定义,并设置为1。Pete的解决方案当然有效,但如果你碰巧构建在英特尔以外的东西上(不太可能,但谁知道呢),这里有一些东西是安全的,只要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_*常量是正确定义的。
这对我来说是最有效的
NSString *name = [[UIDevice currentDevice] name];
if ([name isEqualToString:@"iPhone Simulator"]) {
}
在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
}