2009-05-21 3 views
5

J'écris une application iPhone qui peut être démarrée via une URL personnalisée. Donc, je redéfinis - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)urlComment puis-je déboguer lors de l'implémentation du message handleOpenURL?

Pour tester mes changements, je dois lancer l'application dans le simulateur, puis quitter et lancer Safari. Je tape ensuite mon URL personnalisée dans la barre d'adresse pour lancer l'application. Mais à chaque fois que je lance, l'application se bloque. J'essaie de comprendre pourquoi, mais quand je mets un point d'arrêt et lance l'application à partir de l'écran d'accueil (au lieu de XCode), il ne semble pas attacher.

J'ai même essayé de placer des instructions NSLog dans le message handleOpenURL, mais elles ne sont pas imprimées sur la console. Je suppose que je pourrais créer UIAlertViews mais ... ouais, oui. Toute autre façon de se connecter à une session de débogage dans le simulateur?

Répondre

14

Dans Xcode 4, vous pouvez modifier le schéma de votre cible et dans la section « Exécuter », onglet « Info » , vous pouvez choisir le « Attendez MyApp.app pour lancer » l'option:

enter image description here

Cela entraînera le débogueur d'attendre la prochaine fois que votre application démarre, puis attacher à ce processus plutôt que de créer un nouveau processus pour vous. Cela vous permettra de lancer votre application manuellement à partir de Safari et d'utiliser le débogueur.

+0

Cela devrait être la nouvelle réponse maintenant que Apple a corrigé cela dans Xcode 4. Beaucoup plus facile! – ageektrapped

+1

Cela fait le débogueur, mais NSLog et stdout semblent être perdus :( –

7

Ouvrez Console.app (dans le dossier Utilitaires). Vos messages de journal devraient apparaître ici.

+0

Pour développer cela, les instructions 'NSLog' n'apparaîtront pas dans la console XCode standard si l'application n'a pas été lancée à partir de XCode (c'est-à-dire sur le téléphone ou dans le simulateur). –

+0

Cela n'a pas fonctionné pour moi, mais l'utilisation de l'onglet Console dans la fenêtre XCode Organizer a fait ... –

1

Pouvez-vous écrire un test d'unité qui exercerait la fonctionnalité de votre AppDelegate?

+0

J'ai en fait essayé une autre méthode qui est similaire - J'ai mis un appel à handleOpenURL dans le message de lancement applicationDidFinish, puis lancé normalement et j'ai été capable de traverser. Et le faire de cette façon n'a rien crashé, il ne faisait que s'écraser via les étapes décrites ci-dessus. – bpapa

+0

Votre gestionnaire handleOpenURL s'appuie-t-il sur quelque chose qui est configuré dans applicationDidFinishLaunching? –

+0

En outre, au lieu d'essayer de se connecter à la console, pouvez-vous enregistrer des informations dans un fichier? –

1

Je n'ai pas essayé, mais que diriez-vous d'ajouter une ligne d'instructions point d'arrêt dans votre code:

#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

ajouter ce qui suit en première ligne dans la hadleOpenURL:

[NSThread sleepForTimeInterval: 30,0] et mettre le point d'arrêt sur la ligne suivante après. Après que votre application soit invoquée, vous avez 30 secondes pour aller à XCode et sélectionner dans le menu: Exécuter/"Attacher au processus" et sélectionner le nom de votre application dans la liste. Vous débogueur devrait s'arrêter à votre point d'arrêt. N'oubliez pas de supprimer sleepForTimeInterval lorsque vous avez terminé!

Questions connexes