iPhone模拟器 - 如何检测应用程序何时在模拟器上运行(这样可以设置测试数据)?

Gre*_*reg 24 iphone test-data ios eventkit ios-simulator

在我的iPhone应用程序代码中,任何示例代码都会告诉我如何:

  1. 如何检测应用程序是否刚刚被部署为运行到模拟器(而不是设备)[如果"已部署"不可用,那么只检测应用程序何时在模拟器上运行而不是设备)
  2. 在我的iPhone应用程序代码中,我会将设置我的测试数据的行放在模拟器中 - 这是注意到每次我重新编译并推送到模拟器时我都希望有效地擦除/重新安装测试数据(但是我我真的不希望在我在模拟器中使用应用程序期间运行此代码 - 例如应该能够在模拟器中交换应用程序然后当我在模拟器中再次启动我的应用程序时它不应该运行数据设置代码

任何其他更好的建议如何在模拟器上掩盖管理这些测试数据将是好的.这里的背景是我在谈论日历中的测试数据(例如使用事件工具包),所以当我部署到我的设备时,我不希望应用程序将日历项目放入我的iPhone(对不起 - 只有1个人iPhone在这里).

zrz*_*zka 49

我显然使用这样的东西......

#import <TargetConditionals.h>

#if TARGET_IPHONE_SIMULATOR

// Simulator specific code

#else // TARGET_IPHONE_SIMULATOR

// Device specific code

#endif // TARGET_IPHONE_SIMULATOR
Run Code Online (Sandbox Code Playgroud)

对于你的第二个问题......这样的事情可以帮助你.在您的app委托中:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  if ( ! [[NSUserDefaults standardUserDefaults] boolForKey:@"initialized"] ) {
    // Setup stuff
    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"initialized"];
  }

  ... your code ...
}
Run Code Online (Sandbox Code Playgroud)

  • 2015更新:现在不推荐使用`TARGET_IPHONE_SIMULATOR`,而应使用`TARGET_OS_SIMULATOR`. (3认同)

mah*_*tin 12

如果您想检查运行时(而不是使用#compiler宏编译时间),请使用以下代码:

UIDevice *currentDevice = [UIDevice currentDevice];
if ([currentDevice.model rangeOfString:@"Simulator"].location == NSNotFound) {
    //running on device
} else { 
    // running in Simulator
}
Run Code Online (Sandbox Code Playgroud)

另请参阅此问题: 如何以编程方式确定我的应用程序是否在iphone模拟器中运行?

  • 这不再正确.currentDevice.model现在将返回"iPhone"或"iPad".我想这在最近的SDK更新中已经改变了.我们使用`sysctlbyname("hw.machine")`并将返回值与x86_64进行比较. (3认同)

Niy*_*Ray 11

斯威夫特 5:

TARGET_OS_SIMULATOR在 Swift 5. 中不起作用targetEnvironment(simulator),如下所示:

#if targetEnvironment(simulator)
// code to run if running on simulator
#else
// code to run if not running on simulator
#endif
Run Code Online (Sandbox Code Playgroud)

参考