2012-03-30 18 views
18

Ich habe Code, der beim Start erst ausgelöst wird, nachdem die App aktualisiert oder installiert wurde. Ich möchte diesen Code debuggen, aber ich kann mir keinen Weg dazu vorstellen.Debuggen von iOS-App beim ersten Start

Ich kann die App nicht mit Xcode starten, da sie die vorhandene App überschreiben und das Update nicht auslösen würde.

Ich kann Xcode nicht manuell an den Prozess anhängen, da der Code, den ich debuggen möchte, zu dem Zeitpunkt ausgeführt wurde, an dem ich Xcode angehängt habe.

Gibt es einen Weg, dies zu entfernen, dass ich vermisse?

+0

Sie können Snapshots oder Versionskontrolle nicht verwenden, um Rollbacks/Zurücksetzungen zu verwalten, damit Sie sich keine Sorgen machen müssen, wenn Sie die vorhandene App überschreiben? – rwyland

+0

Wenn Sie nicht möchten, dass Ihr vorhandenes Produkt in Xcode überschrieben wird, können Sie immer eine Kopie des Projektordners erstellen und davon arbeiten. – John

Antwort

39

Verwenden Sie die Option "Warten auf MyApp.app zum Starten".

In Xcode, halten Sie die Wahltaste gedrückt und wählen Sie Product-> Run ... (die Ellipsen werden hinzugefügt, wenn Sie Option gedrückt halten). Dadurch wird der Schemaeditor mit dem ausgewählten Ausführungsschema angezeigt. Klicken Sie auf die Registerkarte Info, und im daraufhin angezeigten Infofenster sehen Sie eine Radiogruppe namens "Starten" mit zwei Optionen: "Automatisch" und "Warten auf das Starten von MyApp.app". Wenn Sie die zweite Option auswählen, startet Xcode den Debugger und wartet darauf, dass Sie Ihre Anwendung manuell starten. Sie können einen Haltepunkt am Anfang des Codes festlegen, den Sie debuggen möchten, und der Debugger wird dort anhalten.

Setzen Sie die App in den vorherigen Zustand zurück.

Sie sollten in Erwägung ziehen, Code hinzuzufügen, der die App in den Zustand versetzt, in dem sie sich vor dem Upgrade befand. Dies kann Debug-Code sein, der vom Release-Build ausgeschlossen ist. Das Debuggen von Problemen, die erfordern, dass Sie die Anwendung jedes Mal neu installieren, wenn Sie Ihr Debugger ausführen möchten, kann Los der Zeit dauern. Auch wenn Sie die App bei jedem Debug-Zyklus neu starten müssen, kostet das viel Zeit. Es ist sehr oft sinnvoll, ein wenig mehr Zeit mit dem Hinzufügen einer Schaltfläche zu Ihrer App zu verbringen, die die von Ihnen vorgenommenen Änderungen rückgängig macht, damit Sie sie erneut ausführen können.

Komponententest.

Eine gute Möglichkeit, Code zu debuggen, der sich mit schwer wiederherstellbaren App-Zuständen beschäftigt, ist das Schreiben von Komponententests. In einem Test können Sie einen beliebigen Status erstellen. Sie können sogar App-Status erstellen, die in Ihrer App möglicherweise nicht wiederhergestellt werden können. Und Sie können diesen Code immer wieder debuggen. Wie bei der vorherigen Lösung dauert es ein wenig mehr Zeit, den Code im Voraus zu schreiben, aber Sie sparen bei jeder Iteration Ihres Debug-Zyklus so viel Zeit, dass es sich lohnt. Noch besser: Sie können den Test zu Ihrem Build-Prozess hinzufügen, um sicherzustellen, dass die Funktionalität nicht später unterbrochen wird.

+1

Vielen Dank für die ausführliche Antwort! Mein Problem war, dass Xcode beim Debugging im Wesentlichen eine neue Version der App auf das Gerät überträgt, und ich den Aktualisierungsprozess von einer beliebigen Version auf die aktuelle Version testen musste.Am Ende habe ich einfach einen alten Zweig von der Quellcodeverwaltung heruntergezogen, diesen auf dem Gerät installiert und dann wie üblich die aktuelle Version von Xcode ausgeführt. So konnte ich den Update-Prozess beobachten. –

+0

Auch über die erste Option ... Wenn ich im "Warte-Modus" debuggen, kann ich die App über den App Store oder Safari zwischen dem Start des Debuggers und dem Starten der App aktualisieren? –

+0

Ähnlich - wie kann ich einen "zweiten Lauf" testen. Bedeutung Ich möchte testen, was passiert, nachdem ich die App geschlossen und wieder geöffnet habe ... –

0

Ich habe auch einige Code, den ich nur auf Upgrades laufen, ich habe diese Methode, die ich am Ende der AnwendungDidFinishLaunch verwenden. Ich kann das auch debuggen:

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

Um erneut zu testen, löschen Sie die App und neu installieren. Oder ändern Sie Ihre Versionsnummer.

Verwandte Themen