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

Iphone 以编程方式检测应用程序是否正在设备或模拟器上运行,iphone,ios,simulator,detect,Iphone,Ios,Simulator,Detect,我想知道我的应用程序在运行时是在设备上运行还是在模拟器上运行。有没有办法检测到这一点 使用模拟器测试蓝牙api的原因: 请参考前面的问题,您可以使用预处理器宏来区分设备和模拟器目标。TARGET\u IPHONE\u模拟器在设备上定义(但定义为false)。定义如下 #if TARGET_IPHONE_SIMULATOR NSString * const DeviceMode = @"Simulator"; #else NSString * const DeviceMode = @"Devic

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

使用模拟器测试蓝牙api的原因:


请参考前面的问题,您可以使用预处理器宏来区分设备和模拟器目标。

TARGET\u IPHONE\u模拟器在设备上定义(但定义为false)。定义如下

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

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

我创建了一个宏,您可以在其中指定要在括号内执行的操作,这些操作仅在模拟设备时执行

#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"));

检查模拟器是否

#if TARGET_IPHONE_SIMULATOR
// Simulator
#endif
检查设备是否

#if !(TARGET_IPHONE_SIMULATOR)
// Device
#endif
检查两个

#if TARGET_IPHONE_SIMULATOR
// Simulator
#else
// Device
#endif
请注意,您不应在
TARGET\u IPHONE\u模拟器
,因为它总是从XCode 9.3+定义为
1
0

,Swift 帮助您根据特定的设备类型进行编码。

使用以下代码:

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

适用于
Swift 4
Xcode 9.4.1

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

using System.Globalization;

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

无需在运行时检查,只需使用TARGET_IPHONE_模拟器定义将该情况与设备上运行的情况区分开来。请注意,这些是编译时宏,在运行时不可用。#包括“TargetConditionals.h”//如果源代码在cDoes中,StackOverflow群组是否存在阅读理解问题?问题是在运行时而不是在编译时进行区分!正确的答案是费尔南多·塞万提斯(Fernando Cervantes)的SIM宏,而不是这一个。然而,在写这篇评论时,这个错误的答案有32分,正确的答案只有3分。@StCredZero也许这是因为编译为在模拟器上运行的代码不能在设备上运行,反之亦然,所以最终,无论是在编译时还是在运行时进行检查都无关紧要。@JohanKool在某些情况下,这确实很重要,例如,如果您正在编写一个在其他人的应用程序中使用的静态库。您没有编译时检查的奢侈,因为您的代码已经编译过了。因此,您的支票需要在运行时进行。举个例子:包括一条针对Xcode 8模拟器bug的警告消息:UIDevice的
模型
属性不包含来自iOS 9的
模拟器
单词非常感谢!ifdef是一个恶魔)新的宏只适用于swift:是的,我忘了提到它。后期编辑。tnx@stonedauwg
#if targetEnvironment(simulator)
   // iOS Simulator
#else
   // Device
#endif
using System.Globalization;

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