26

在我的 iPhone 应用程序代码中,任何可以向我展示如何操作的示例代码:

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

关于如何掩盖在模拟器上管理此测试数据的任何其他更好的建议都会很好。这里的背景是我在谈论日历中的测试数据(例如使用 Event Kit),所以当我部署到我的设备时,我不想让应用程序将日历项目放入我的 iPhone 中(抱歉 - 只有 1 个人iPhone在这里)。

4

4 回答 4

50

我显然确实使用了这样的东西......

#import <TargetConditionals.h>

#if TARGET_IPHONE_SIMULATOR

// Simulator specific code

#else // TARGET_IPHONE_SIMULATOR

// Device specific code

#endif // TARGET_IPHONE_SIMULATOR

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

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

  ... your code ...
}
于 2011-02-25T20:32:08.880 回答
13

斯威夫特 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

参考

于 2019-05-12T15:26:19.990 回答
12

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

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

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

于 2013-11-11T14:18:56.523 回答
1

对我有用的代码块:

#if defined(__i386__)  || defined(__x86_64__)
    /* Run code if in Simulator */
#else
    /* Run code if in device */
#end

我注意到__i386__不适用于 iPhone 6 模拟器,所以我添加了 x86_64

于 2015-11-08T17:45:31.660 回答