我有一段代码,只有在应用程序升级或安装后才会触发。我想调试这段代码,但是不知道如何做。
我不能使用Xcode启动应用程序,因为它会覆盖现有的应用程序,不会触发更新。
我也不能手动将Xcode附加到进程上,因为我想要调试的代码将在我附加Xcode之前执行。
我是否错过了某种能够做到这一点的方法?
我有一段代码,只有在应用程序升级或安装后才会触发。我想调试这段代码,但是不知道如何做。
我不能使用Xcode启动应用程序,因为它会覆盖现有的应用程序,不会触发更新。
我也不能手动将Xcode附加到进程上,因为我想要调试的代码将在我附加Xcode之前执行。
我是否错过了某种能够做到这一点的方法?
使用“等待MyApp.app启动”选项。
在Xcode中,按住Option键选择Product->Run...(当你按住Option时会出现省略号)。这将打开方案编辑器,并选择Run方案。点击Info标签,在结果面板上,您将看到一个名为“Launch”的单选组,有两个选项:“自动”和“等待MyApp.app启动”。如果选择第二个选项,则Xcode将启动调试器并等待您手动启动应用程序。您可以在要调试的代码开始处设置断点,调试器会在那里停止。
将应用还原到之前的状态。
您可能想考虑添加一些代码来将应用程序还原到升级之前的任何状态。这可以是排除发布版本的调试代码。调试需要每次运行调试都重新安装应用程序可能需要很长时间。即使只是需要在每次调试周期之间重新启动应用程序也会花费大量时间。因此,在您的应用程序中添加一个按钮来撤消您正在进行的任何更改,以便您可以再次执行它们是非常值得的。
进行单元测试。
一种非常好的调试处理难以重建的应用程序状态的代码的方法是编写单元测试。在测试中,您可以创建任何状态。您甚至可以创建可能无法在应用程序中重建的应用程序状态。而且您可以一遍又一遍地进行调试。像前面的解决方案一样,编写代码需要花费更多时间,但每次调试周期都能节省大量时间,因此这是非常值得的。甚至更好的是,您可以将该测试添加到构建过程中,以帮助确保功能不会在以后出现故障。
我还有一些只在升级时运行的代码,我在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];
}
若要重新测试,请删除应用并重新安装。或更改版本号。