Débogage de l'application lors du lancement par notification push

135

Je développe actuellement une application qui reçoit des notifications push. Tout cela fonctionne à 100% via une page PHP. Il existe plusieurs types de notifications push que mon application peut recevoir. Le PHP gère cela et envoie différents paquets d'informations à mon application qui sont tous très bien reçus.

Cependant, lorsque les utilisateurs «consultent» la notification et que mon application se lance, je souhaite évidemment prendre une action différente de celle que je ferais si l'utilisateur venait de lancer l'application manuellement - et en plus de cela, des actions différentes selon le type de notification push. Cela fonctionne bien ... structurellement.

L'un de mes types de push est censé ouvrir un UIView qui établit plusieurs connexions à plusieurs serveurs différents et négocie les données dans les deux sens. Cet UIView fonctionne bien lorsque, par exemple, il est déclenché à partir du menu principal - cependant, lorsque ma notification push déclenche l'affichage de cet UIView, les connexions de socket ne fonctionnent pas comme prévu.

Maintenant, ma question ne concerne pas les sockets, mais plus encore - Comment déboguer un tel problème? D'après ce que je peux dire (je suis relativement nouveau) lorsque l'application est lancée à partir d'une notification push, il n'y a aucun moyen de lier cette exécution au débogueur / console / etc ... J'ai du mal à essayer de déboguer le code en utilisant UIAlertViews, car il existe de nombreuses lignes de communication entre les différents serveurs.

Tout conseil que vous pourriez me donner serait grandement apprécié.

Dutchie432
la source

Réponses:

147

Dans XCode <4.0 (pour XCode> = 4, voir la réponse par delirus ci-dessous), vous pouvez maintenant configurer Xcode pour attacher le débogueur à l'application après l'avoir lancée, au lieu de lancer l'application via le débogueur. Cela vous permet de déboguer des éléments qui varient en fonction de l'état de lancement de votre application, tels que les schémas d'URL, les tableaux de montage et les notifications push.

  1. Dans Xcode, regardez dans la barre Source, et sous les cibles, il y aura des exécutables.
  2. Affichez l'inspecteur de votre application dans les exécutables.
  3. Cliquez sur l'onglet de l'onglet Débogage dans l'inspecteur.
  4. Décochez "Démarrer l'exécutable après le démarrage du débogueur"
  5. Cochez la case "Attendre le prochain lancement / notification push"

Désormais, lorsque vous cliquez sur déboguer à partir de Xcode au lieu de lancer l'application, une fenêtre s'affiche indiquant qu'elle attend le lancement de l'application. Vous lancez ensuite l'application normalement sur le téléphone et Xcode s'y attache

Louis Gerbarg
la source
37
Je sais que ce n'est peut-être pas approprié, mais je t'aime. :)
Dutchie432
17
Lorsque vous lancez de cette façon les stdin, stdout et stderr de votre application ne sont pas acheminés vers la console de GDB, ils sont pointés là où ils se trouvent lors d'un lancement normal de l'application. Vous pouvez voir les NSLog () dans la console système de l'appareil en regardant l'appareil dans l'organiseur.
Louis Gerbarg
1
Vous m'avez appris quelques points très précieux ici. MERCI. J'ai passé les 2 derniers jours à essayer de déboguer quelque chose que j'ai pu corriger dans les 20 minutes suivant votre publication.
Dutchie432
1
@stigi fonctionne dans le simulateur pour moi pour tester les schémas d'URL. J'utilise xcode 4.5 si cela compte
dreyln
1
@dreyln mon commentaire date de 2009 :) beaucoup de choses ont changé depuis. Mais merci pour la tête!
stigi
124

Pour Xcode 4, vous devez:

  1. Modifiez votre schéma actif via le menu déroulant "Schémas". ( + <)
  2. Ensuite, choisissez votre produit - «Exécutez MyApp.app» sur la gauche.
  3. Sélectionnez l'onglet «Info» sur la droite.
  4. Et enfin, choisissez l'option "Attendre le lancement de MyApp.app".

Plus d'informations ici dans la section "Personnaliser les exécutables dans l'éditeur de schéma".

EDIT:
Si vous manquez des journaux dans GDB, voir le commentaire de Louis Gerbarg à sa réponse.

matm
la source
1
Je suis avec Xcode 4.2 pour Lion et, bien que l'application se lance correctement à partir du schéma d'URL et que l'exécution du débogueur ne s'arrête pas, la console ne montre rien. Est-ce que je manque quelque chose?
LoDani
@LoDani même ici, avez-vous déjà compris pourquoi?
davis
3
@LoDani, Davis G.: Avez-vous vu le commentaire de Louis sur la réponse acceptée? stackoverflow.com/questions/1239000/... Lorsqu'il est lancé de cette façon, stdin / out / err ne sont pas redirigés vers la console.
Ivan Vučica
Merci, vous avez sauvé ma journée! Essayer de résoudre un bogue qui ne se produit que lorsque mon application est démarrée par un gestionnaire d'URL.
Eliot
@delirus - Merci d'avoir mis à jour ceci pour XCode 4.
Dutchie432
112

Pour XCode 10, 9, 8, 7 et 6:

  1. Sélectionnez le schéma dans la barre d'outils (juste à gauche de l'appareil avec lequel vous déboguez)
  2. Choisissez Modifier le schéma
  3. Sélectionnez Exécuter dans le panneau de gauche
  4. Pour l' option de lancement , sélectionnez Attendre le lancement de l'exécutable
  5. Fermez l'éditeur de schéma et exécutez votre projet XCode

Vous pouvez désormais déboguer lors du lancement à partir d'une notification, d'une URL personnalisée ou en touchant l'icône de l'application.

bgolson
la source
9
Cette réponse m'a causé beaucoup de problèmes même si elle m'a généralement mis sur la bonne voie. L'étape 3 est un peu trompeuse. Vous devez le faire, bien sûr; sélectionnez Exécuter dans le panneau de gauche. Mais, il devrait également y avoir une étape 5 avec un libellé conceptuel très similaire: Cliquez sur le bouton Exécuter de xcode, avant d'attendre les résultats ... Puisque au début cela ne fonctionnait pas pour moi, j'ai demandé conseil à d'autres collègues ... ils ont demandé moi si j'ai fait la chose Run, à laquelle j'ai répondu oui, en pensant à l'option non. 3 ... Il devrait vraiment, vraiment, vraiment y avoir une étape 5 à cela ...
Florin Odagiu
@FlorinOdagiu Bon appel. Ajout de l'étape 5. Merci!
bgolson
Dans le cas où Xcode restaure un onglet de schéma différent, l'option Lancer se trouve sous l'onglet Info.
Nate Whittaker
3
Je n'obtiens aucune sortie dans la fenêtre du débogueur lorsque je lance l'application manuellement.
dvdblk
3

Je ne travaille pas avec les notifications push, donc je ne connais pas le fonctionnement exact des notifications push. Cependant, j'essaierais d'imiter la réception d'une notification push en laissant la méthode principale de votre programme prétendre qu'une notification a été publiée si possible, ou en appelant l'application: didFinishLaunchingWithOptions: méthode UIApplicationDelegate à partir de la méthode applicationDidFinishLaunching:.

HTH - Salut, Daan

Drvdijk
la source
C'est aussi une bonne idée, mais l'imitation est toujours la deuxième meilleure solution pour déboguer la vraie chose! Bon codage!
Dutchie432
3

Dans Xcode 6:

  1. connectez l'iPhone au Macbook avec USB
  2. lancez l'application sur l'iPhone en appuyant sur l'icône
  3. Dans le menu Xcode, Debug> Attach to Process> Choisissez votre App
Ali Saeed
la source
1
Vous ne pourrez pas déboguer le chemin de lancement critique avec cette approche.
Zorayr
2

Pour XCode 11 et 10, vous pouvez effectuer les opérations suivantes:

  1. Sélectionnez l'option Scheme.
  2. Choisissez Modifier le schéma.

  3. Sélectionnez l'option Exécuter dans le panneau de gauche

  4. Dans la partie lancement, sélectionnez attendre le lancement de l'exécutable , puis fermez la boîte de dialogue.

  5. Générez et exécutez le projet. Vous pouvez maintenant lancer l'application en appuyant sur l'icône de l'application ou en appuyant sur le message de notification.

Ramy Rizkalla
la source