Programmatically detect if app is being run on device or simulator
IphoneIosSimulatorDetectIphone Problem Overview
I'd like to know whether my app is being run on device or simulator at run time. Is there a way to detect this?
Reason being to test bluetooth api with simulator: http://volcore.limbicsoft.com/2009/09/iphone-os-31-gamekit-pt-1-woooohooo.html
Iphone Solutions
Solution 1 - Iphone
#if TARGET_OS_SIMULATOR
//Simulator
#else
// Device
#endif
Pls refer this previous SO question also https://stackoverflow.com/questions/146986/what-defines-are-setup-by-xcode-when-compiling-for-iphone
Solution 2 - Iphone
I created a macro in which you can specify which actions you want to perform inside parentheses and these actions will only be performed if the device is being simulated.
#define SIM(x) if ([[[UIDevice currentDevice].model lowercaseString] rangeOfString:@"simulator"].location != NSNotFound){x;}
This is used like this:
SIM(NSLog(@"This will only be logged if the device is simulated"));
Solution 3 - Iphone
TARGET_IPHONE_SIMULATOR is defined on the device (but defined to false). and defined as below
#if TARGET_IPHONE_SIMULATOR
NSString * const DeviceMode = @"Simulator";
#else
NSString * const DeviceMode = @"Device";
#endif
Just use DeviceMode
to know between device and simulator
Solution 4 - Iphone
Check if simulator
#if TARGET_IPHONE_SIMULATOR
// Simulator
#endif
Check if device
#if !(TARGET_IPHONE_SIMULATOR)
// Device
#endif
Check for both
#if TARGET_IPHONE_SIMULATOR
// Simulator
#else
// Device
#endif
Please note that you should not ifdef
on
TARGET_IPHONE_SIMULATOR
because it will always be defined to either 1
or 0
.
Solution 5 - Iphone
From XCode 9.3+ , Swift
#if targetEnvironment(simulator)
//Simulator
#else
//Real device
#endif
Helps you to code against device type specific.
Solution 6 - Iphone
You can use the TARGET_IPHONE_SIMULATOR preprocessor macro to distinguish between device and simulator targets.
Solution 7 - Iphone
Use this below code:
#if targetEnvironment(simulator)
// iOS Simulator
#else
// Device
#endif
Works for Swift 4
and Xcode 9.4.1
Solution 8 - Iphone
if anyone is looking for Unity
solution i did this, the only way i found how.
using System.Globalization;
public static bool IsArm() {
return CultureInfo.InvariantCulture.CompareInfo.IndexOf(SystemInfo.processorType, "ARM", CompareOptions.IgnoreCase) >= 0;
}