我的代码只有在升级或安装应用程序后才会在启动时触发。我想调试这段代码,但想不出办法。
我无法使用Xcode启动应用程序,因为它会覆盖现有应用程序并且不会触发更新。
我无法手动将Xcode附加到进程,因为我想调试的代码将在我连接Xcode时执行。
有什么东西可以解决这个问题吗?
答案 0 :(得分:47)
使用“等待MyApp.app启动”选项。
在Xcode中,按住Option键并选择Product-> Run ...(当您按住Option时会添加省略号)。这将打开方案编辑器,选择Run方案。单击“信息”选项卡,在生成的“信息”面板上,您将看到标有“启动”的无线电组,其中包含两个选项:“自动”和“等待MyApp.app启动”。如果选择第二个选项,Xcode将启动调试器并等待您手动启动应用程序。您可以在要调试的代码的开头设置断点,调试器将停在那里。
将应用重置为之前的状态。
您可能需要考虑添加一些代码,将应用程序重置为升级前的状态。这可以是从发布版本中排除的调试代码。调试每次要运行调试时需要重新安装应用程序的问题都需要批次时间。即使只是在每个调试周期重新启动应用程序也会耗费大量时间。通常花一点时间为你的应用添加一个按钮来撤消你正在做的任何改变,以便你可以再做一次。
单元测试。
调试处理难以重新创建的应用状态的代码的一种好方法是编写单元测试。在测试中,您可以创建所需的任何状态。您甚至可以创建可能无法在应用中重新创建的应用状态。您可以一遍又一遍地调试该代码。与之前的解决方案一样,预先编写代码需要花费更多的时间,但是您将在调试周期的每次迭代中节省大量时间,这非常值得。更好的是,您可以将测试添加到构建过程中,以帮助确保功能不会在以后中断。
答案 1 :(得分:0)
我也有一些代码,我只在升级时运行,我在下面使用这个方法,我在applicationDidFinishLaunching结束时使用它。我也可以调试它:
- (void) determineWhetherToForceSync {
NSString *currentVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
NSString *savedVersionKey = @"savedVersionKey";
NSString *savedVersion = [[NSUserDefaults standardUserDefaults] valueForKey:savedVersionKey];
if (!savedVersion) {
//This is a fresh install....
} else {
//They have a saved version, so check if it's the same as current version
if (![currentVersion isEqualToString:savedVersion]) { //They have done an upgrade
//This is an update
} //.... else they are starting the app on a second attempt
}
//Save the current version
[[NSUserDefaults standardUserDefaults] setObject:currentVersion forKey:savedVersionKey];
}
要重新测试,请删除该应用并重新安装。或者更改您的版本号。