2009-05-21 14 views
5

Sto scrivendo un'app per iPhone che può essere avviata tramite un URL personalizzato. Quindi, ho l'override - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)urlCome si esegue il debug durante l'implementazione del messaggio handleOpenURL?

Per testare le mie modifiche, devo eseguire l'app nel simulatore, quindi uscire e avviare Safari. Quindi digito il mio URL personalizzato nella barra degli indirizzi per avviare l'app.

Ma ogni volta che si avvia, l'app si arresta in modo anomalo. Sto cercando di capire perché, ma quando imposto un breakpoint e avvio l'app dalla schermata principale (invece che in XCode) non sembra collegarsi.

Ho anche provato a inserire istruzioni NSLog nel messaggio handleOpenURL, ma non vengono stampate nella console.

Suppongo di poter creare UIAlertViews ma ... sì, sì. Qualunque altro modo per connettersi a una sessione di debug in Simulator?

risposta

14

In Xcode 4, è possibile modificare lo schema di vostro target e nella sezione "Run", scheda "Info" , è possibile scegliere l'opzione "Wait for MyApp.app per lanciare":

enter image description here

Questo farà sì che il debugger di aspettare fino alla prossima volta la vostra applicazione si avvia, e poi allegare a tale processo, piuttosto che la creazione di un nuovo processo per te. Questo ti permetterà di lanciare la tua app manualmente da Safari e utilizzare il debugger.

+0

Questa dovrebbe essere la nuova risposta ora che Apple ha risolto questo problema in Xcode 4. Molto più facile! – ageektrapped

+1

Questo aggancia il debugger, ma NSLog e stdout sembrano persi :( –

7

Apri Console.app (nella cartella Utilità). I tuoi messaggi di registro dovrebbero apparire lì.

+0

Per espandere ulteriormente, le istruzioni 'NSLog' non verranno visualizzate nella console XCode standard se l'app non è stata avviata da XCode (ovvero sul telefono o all'interno del simulatore). –

+0

Questo non ha funzionato per me, ma utilizzando la scheda Console nella finestra XCode Organizer ... –

1

È possibile scrivere un test unitario che eserciterebbe la funzionalità del proprio AppDelegate?

+0

Ho effettivamente provato un altro modo simile: ho messo una chiamata a handleOpenURL nel messaggio di avvio applicationDidFinish e poi lanciato come normale e sono stato in grado di intervenire. E farlo in questo modo non ha causato alcun crash, si è verificato un arresto anomalo solo tramite i passaggi sopra descritti. – bpapa

+0

Il gestore handleOpenURL si basa su qualcosa configurato in applicationDidFinishLaunching? –

+0

Inoltre, anziché tentare di accedere alla console, è possibile salvare alcune informazioni in un file? –

1

Non ho provato questo, ma come circa l'aggiunta di una linea di istruzioni punto di interruzione nel codice:

#if TARGET_CPU_ARM == 1 
#define breakpoint() __asm__ volatile ("bkpt 0") 
#else // !ARM - assume INTEL. Everything else will break 
#define breakpoint() __asm__ volatile ("int3"); 
#endif 
1

aggiungere quanto segue come prima riga nel hadleOpenURL:

[NSThread sleepForTimeInterval: 30,0] e mettere il punto di interruzione nella riga successiva dopo.

Dopo aver richiamato l'applicazione, saranno necessari 30 secondi per passare a XCode e selezionare dal menu: Esegui/"Collega a processo" e selezionare il nome dell'applicazione dall'elenco. Il debugger dovrebbe fermarsi al punto di interruzione.

Non dimenticare di rimuovere sleepForTimeInterval quando hai finito!

Problemi correlati