首次启动iOS应用程序时调试

27

我有一段代码,只有在应用程序升级或安装后才会触发。我想调试这段代码,但是不知道如何做。

我不能使用Xcode启动应用程序,因为它会覆盖现有的应用程序,不会触发更新。

我也不能手动将Xcode附加到进程上,因为我想要调试的代码将在我附加Xcode之前执行。

我是否错过了某种能够做到这一点的方法?


你不能使用快照或版本控制来管理回滚/还原,所以不用担心“覆盖现有应用程序”的问题? - rwyland
如果您不想覆盖Xcode中现有的产品,您可以始终复制项目文件夹并在其上工作。 - Henry F
2个回答

56

使用“等待MyApp.app启动”选项。

在Xcode中,按住Option键选择Product->Run...(当你按住Option时会出现省略号)。这将打开方案编辑器,并选择Run方案。点击Info标签,在结果面板上,您将看到一个名为“Launch”的单选组,有两个选项:“自动”和“等待MyApp.app启动”。如果选择第二个选项,则Xcode将启动调试器并等待您手动启动应用程序。您可以在要调试的代码开始处设置断点,调试器会在那里停止。

将应用还原到之前的状态。

您可能想考虑添加一些代码来将应用程序还原到升级之前的任何状态。这可以是排除发布版本的调试代码。调试需要每次运行调试都重新安装应用程序可能需要很长时间。即使只是需要在每次调试周期之间重新启动应用程序也会花费大量时间。因此,在您的应用程序中添加一个按钮来撤消您正在进行的任何更改,以便您可以再次执行它们是非常值得的。

进行单元测试。

一种非常好的调试处理难以重建的应用程序状态的代码的方法是编写单元测试。在测试中,您可以创建任何状态。您甚至可以创建可能无法在应用程序中重建的应用程序状态。而且您可以一遍又一遍地进行调试。像前面的解决方案一样,编写代码需要花费更多时间,但每次调试周期都能节省大量时间,因此这是非常值得的。甚至更好的是,您可以将该测试添加到构建过程中,以帮助确保功能不会在以后出现故障。


1
感谢您提供详尽的回复!我的问题在于调试时,Xcode 实际上会将新版本的应用程序推送到设备上,而我需要测试从任意版本到当前版本的更新过程。最终,我只需从源代码控制中拉取一个旧分支,在设备上安装该分支,然后像往常一样从 Xcode 运行当前版本。这使我能够观察更新过程。 - Adam Ritenauer
另外,关于第一个选项...如果我在“等待模式”下开始调试,那么在启动调试器和启动应用程序之间,我能否通过应用商店或Safari更新应用程序? - Adam Ritenauer
同样地 - 我如何测试“第二次运行”。我的意思是,我想测试在关闭应用程序并再次打开它后会发生什么... - Nathan H
3
没想到还可以在调试前等待的选项!谢谢! - livingtech
1
这非常有帮助!我已经使其连接并在断点处停止,但是日志似乎仍然为空。 - fknChaos
1
这非常有用,谢谢。这是一个启用“等待可执行文件启动”的屏幕截图:https://i.stack.imgur.com/HrOLN.png - Ben Butterworth

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]; 
}

若要重新测试,请删除应用并重新安装。或更改版本号。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接