以编程方式检测应用程序是不是正在设备或模拟器上运行

Posted

技术标签:

【中文标题】以编程方式检测应用程序是不是正在设备或模拟器上运行【英文标题】:Programmatically detect if app is being run on device or simulator以编程方式检测应用程序是否正在设备或模拟器上运行 【发布时间】:2011-08-12 03:17:30 【问题描述】:

我想知道我的应用在运行时是在设备上运行还是在模拟器上运行。有没有办法检测到这一点?

使用模拟器测试蓝牙 api 的原因: http://volcore.limbicsoft.com/2009/09/iphone-os-31-gamekit-pt-1-woooohooo.html

【问题讨论】:

无需在运行时检查,只需使用 TARGET_IPHONE_SIMULATOR 定义将该情况与在设备上运行的情况区分开来。 【参考方案1】:
#if TARGET_OS_SIMULATOR

//Simulator

#else

// Device

#endif

请同时参考之前的 SO 问题What #defines are set up by Xcode when compiling for iPhone

【讨论】:

请注意,这些是编译时宏,在运行时不可用。 #include "TargetConditionals.h" // 如果你的源代码在 c 中 *** 人群是否有阅读理解问题?问题是询问在 runtime 而不是在编译时进行区分!正确答案是 Fernando Cervantes 的 SIM 宏,而不是这个。然而,在撰写此评论时,这个错误答案有 32 分,正确答案只有 3 分。 @StCredZero 也许那是因为编译为在模拟器上运行的代码不能在设备上运行,反之亦然,所以最后无论你是在编译时进行检查还是在运行时。 @JohanKool 在某些情况下确实很重要,例如,如果您正在编写用于其他人的应用程序的静态库。您没有编译时检查的奢侈,因为您的代码已经被编译。因此,您的检查需要在运行时进行。恰当的例子:包括针对此 Xcode 8 模拟器错误的开发人员的警告消息:forums.developer.apple.com/message/179846【参考方案2】:

您可以使用TARGET_IPHONE_SIMULATOR 预处理器宏来区分设备和模拟器目标。

【讨论】:

【参考方案3】:

TARGET_IPHONE_SIMULATOR 在设备上定义(但定义为 false)。并定义如下

#if TARGET_IPHONE_SIMULATOR
NSString * const DeviceMode = @"Simulator";
#else
NSString * const DeviceMode = @"Device";
#endif

只需使用DeviceMode 了解设备和模拟器之间的关系

【讨论】:

【参考方案4】:

我创建了一个宏,您可以在其中指定要在括号内执行的操作,并且这些操作只有在设备被模拟时才会执行。

#define SIM(x) if ([[[UIDevice currentDevice].model lowercaseString] rangeOfString:@"simulator"].location != NSNotFound)x;

这样使用:

SIM(NSLog(@"This will only be logged if the device is simulated"));

【讨论】:

UIDevice 的 model 属性不包含来自 ios 9 的 simulator【参考方案5】:

检查是否模拟器

#if TARGET_IPHONE_SIMULATOR
// Simulator
#endif

检查是否设备

#if !(TARGET_IPHONE_SIMULATOR)
// Device
#endif

检查两者

#if TARGET_IPHONE_SIMULATOR
// Simulator
#else
// Device
#endif

请注意,您不应该在ifdef TARGET_IPHONE_SIMULATOR 因为它总是被定义为10

【讨论】:

非常感谢! ifdef 是邪恶的)【参考方案6】:

来自 XCode 9.3+ ,Swift

#if targetEnvironment(simulator)
//Simulator
#else
//Real device
#endif

帮助您针对特定设备类型进行编码。

【讨论】:

该新宏仅适用于 swift:developer.apple.com/library/content/releasenotes/DeveloperTools/… 是的,我忘了提。帖子已编辑。 tnx @stonedauwg【参考方案7】:

使用下面的代码:

#if targetEnvironment(simulator)
   // iOS Simulator
#else
   // Device
#endif

适用于 Swift 4Xcode 9.4.1

【讨论】:

【参考方案8】:

如果有人在寻找 Unity 解决方案,我这样做了,这是我找到方法的唯一方法。

using System.Globalization;

public static bool IsArm() 
        return CultureInfo.InvariantCulture.CompareInfo.IndexOf(SystemInfo.processorType, "ARM", CompareOptions.IgnoreCase) >= 0;
    

【讨论】:

以上是关于以编程方式检测应用程序是不是正在设备或模拟器上运行的主要内容,如果未能解决你的问题,请参考以下文章

Android:以编程方式检测设备是不是有硬件菜单按钮

我们如何以编程方式检测运行设备的iOS版本? [重复]

Win32 API 函数以编程方式启用/禁用设备

如何以编程方式检测 iOS 设备

如何以编程方式在android中检测设备电源按钮按下两次

使用 UI 自动化以编程方式打开/关闭真实 iOS 设备上的 wifi