web-dev-qa-db-fra.com

Comment déboguer les extensions iOS 8 avec NSLog?

- (void)viewDidLoad
{
    NSLog(@"%s", __func__);
    // ...
}

dans viewDidLoad d'un iOS 8 extension. le NSLog ne génère rien dans Xcode. NSLog fonctionne comme d'habitude dans l'application conteneur.

Comment puis-je obtenir la sortie de messages de débogage à partir d'une extension?

87
ohho
  1. Le débogage fonctionne pour les extensions d'applications.
  2. Cela fonctionne aussi sur simulateur.
  3. Si votre application ext se bloque dans le simulateur, vous constaterez peut-être qu'il n'est pas facile de redémarrer votre application ext. Le redémarrage de votre simulateur est une solution rapide.
  4. Procédure pour déboguer une extension d'application:

    1. Exécutez l'application de conteneur. Au cours de cette étape, Xcode télécharge l’application conteneur et son extension sur le périphérique ou le simulateur.

    2. Arrêtez l'application conteneur. Cette étape est importante lorsque vous déboguez dans le simulateur. Si vous ne le faites pas, Xcode vous dira que le simulateur est en cours d'utilisation.

    3. Dans Xcode, appuyez sur le menu Débogage -> Attacher au processus -> Par identificateur de processus (PID) ou Nom ..., saisissez l'identifiant de l'extension de l'application, par exemple. com.abc.ContainerApp.MyExtension, pour démarrer le débogage. N'oubliez pas de définir des points d'arrêt. (Mise à jour du 25 août 2014: vous pouvez saisir directement MyExtension (nom de votre extension).)

    4. Dans l'appareil ou le simulateur, ouvrez l'extension de votre application.


Mises à jour le 23 août 2014:

J'ai constaté que les étapes de débogage ci-dessus ne fonctionnaient pas bien sur Xcode 6 bêta 6 avec iOS 8 SDK bêta 5 sur le simulateur.

Solution:

  1. Exécutez votre extension dans le simulateur.
  2. Menu Xcode Débogage -> Attacher au processus -> Choisissez "MyExtension (nom de votre extension)" dans la section Système du menu.

Les points d'arrêt fonctionnent. Mais je ne sais pas pourquoi les journaux ne s'affichent pas dans la fenêtre de sortie.

95
Vince Yuan

J'ai aussi ce problème. Cela fonctionne pour moi si vous allez dans votre simulateur sous le menu Debug -> Open System Log ...

À partir de là, vous pouvez voir tous les journaux du simulateur iPhone (y compris les journaux de votre extension).

enter image description here

49
BalestraPatrick

NSLog fonctionne parfaitement.

Vous ne voyez tout simplement pas ce qui est enregistré dans la zone de débogage de Xcode car le débogueur Xcode n'est pas attaché à votre extension. Les extensions sont presque complètement indépendantes de l'application qu'elles contiennent. Par exemple, ils ont des identificateurs de paquet distincts et sont également des processus distincts sur le système d'exploitation.

J'ai eu beaucoup de succès à faire attacher Xcode à des extensions. Soi-disant, cela semble attacher automatiquement, et il apparaît dans le navigateur de débogage comme "En attente pour attacher", mais jamais attacher.

Parfois, je peux exécuter ma cible d'extension dans Xcode:

enter image description here

Et puis avoir la possibilité de choisir quelle application exécuter mon extension po. Dans ce cas, je choisirais sa recommandation de "aujourd'hui", qui est le centre de notification.

enter image description here

Et puis il serait parfois attacher le débogueur à mon extension. Notez que cette méthode ne fonctionne que sur les périphériques physiques, semble-t-il.

S'il ne se lie pas, vous pouvez utiliser la méthode de la pièce jointe manuelle dans la réponse de @ VinceYaun,

J'ai également eu un succès varié en utilisant d'autres méthodes d'attachement. La plupart ont échoué et il semble que ce ne sont que des bogues qui seront corrigés ultérieurement.

Pour afficher vos messages de journal, accédez à Window -> Devices dans la barre supérieure et sélectionnez votre appareil. Vous pouvez afficher le journal du périphérique à partir du bas de cette fenêtre. Si vous testez sur un simulateur, vous pouvez utiliser la fonction answer de BalestraPatrick.

Certains bogues ont été corrigés dans la version bêta 2 et je suppose que le débogueur finira par se connecter automatiquement lors du lancement de l'extension.

Mise à jour: Sous iOS 8 Bêta 4 notes de version :

Les extensions

Fixé en beta 4

  • Les extensions ne parviennent parfois pas à se lancer lors du débogage à partir de Xcode.
  • Lorsque l'extension avec interface utilisateur est tuée, elle est relancée et n'est pas renvoyée.
  • Parfois, votre extension de partage ou d'action peut se bloquer.
  • Le redéploiement d'une extension peut la désactiver dans le Centre de notifications.
32
Santa Claus

J'ai aussi ce problème. Xcode n'attache jamais mon débogueur à l'extension ou affiche des messages NSLog. Si vous associez manuellement le débogueur Xcode à votre processus d'extension, au moins les points d'arrêt fonctionnent comme un charme:

Debug->Attach to process->Your extension name (mine was "com.example.MyExtensionApp.MyExtension")
18
Masalis
  1. Créer un schéma pour votre extension
  2. Schéma d'exécution
  3. Dans une boîte de dialogue, choisissez une application de conteneur.
  4. Prendre plaisir

Cela fonctionne pour moi :)

12
Maciek Czarnik

Xcode 8 est capable de déboguer des extensions:

  1. Choisissez le schéma d'extension dans la liste déroulante à côté du bouton d'arrêt et exécutez-le.
  2. Sélectionnez l'application parente dans la boîte de dialogue qui apparaît.

Résultat: les points d'arrêt et le journal fonctionnent comme d'habitude.

4
Jano

Ce qui m'a finalement permis de voir le journal dans la zone de débogage, sur la base de suggestion de Michael et documentation d'Apple , c'est:

Générez et exécutez l'extension de l'application dans le simulateur et, lorsque vous y êtes invité, choisissez l'application spécifique à partir de laquelle vous allez appeler l'extension . . Dans mon cas, je lançais mon extension Action à partir de Safari en créant une feuille de partage sur un fichier PDF.

Ce qui ne fonctionnait pas avant, c'était de suivre les suggestions d'autres personnes d'utiliser Today en tant qu'hôte, mais de quitter ensuite l'application et de faire appel à Safari pour appeler mon extension. Je n'ai même plus besoin d'exécuter mon application contenant avant d'exécuter l'extension.

De la documentation d'Apple:

Dans la phase d’exécution de votre schéma d’extension, vous spécifiez une application hôte comme exécutable. Lors de l'accès à l'extension via l'interface utilisateur de l'hôte spécifié, le débogueur Xcode se connecte à l'extension.

4
Andrew

Une astuce qui fonctionne pour moi (même si elle est assez laide) consiste à placer un mannequin UILabel quelque part dans le coin inférieur de mon extension. Je l'appelle habituellement logLabel. Il est alors possible de mettre à jour le texte de cette étiquette avec n'importe quelle instruction de journal que vous souhaitez enregistrer. Une telle approche n’est pas très utile si vous devez consigner des instructions à partir d’instances de classes différentes. Et, évidemment, cela encombre votre interface utilisateur.

Cependant, si vous avez un widget assez simple et que cela ne vous dérange pas que l'encombrement de l'interface utilisateur soit un peu encombré, c'est ce qui se passe. J'ai essayé toutes les autres solutions décrites dans cette discussion et, malheureusement, aucune d'entre elles n'a fonctionné pour moi.

1
Andriy Gordiychuk

Rencontrez le même problème d’extension pour NSLog et de points de rupture. Je l'ai combattu pendant plusieurs jours.

Device log peut être trouvé comme image suivante. C'est a XCode -> Window -> Devices and Simulators.

Après avoir entré le Open Console, il y a un champ de recherche en haut à droite de la boîte de dialogue. Je peux appliquer la règle de filtrage ici. Par exemple, un nom de processus contient Notification key Word ou le nom de processus doit être égal au nom de l'extension cible, ex: égal à MyNotificationServiceExtension nom de processus.

Device log

1
AechoLiu

Le débogage ne fonctionne que pour moi en sélectionnant Déboguer-> Attacher au processus par PID ou Nom, puis entrez le PID pas le nom de l'extension. Vous pouvez trouver le PID en exécutant l'extension sur un périphérique, allez à Fenêtre-> Périphériques. Trouvez votre appareil et consultez la console. Lorsque vous voyez le nom de votre poste, il est suivi d'un numéro à 5 chiffres. C'est le PID

J'ai également mis un tas de NSLog dans l'extension afin de trouver également le PID. C'est sur xCode 7

1
Tony

En fait, les journaux s’exécutent tout simplement dans Xcode 6.3. Tout d'abord, construisez et exécutez l'application qui le contient. Une fois que l'application contenant est en cours d'exécution sur le périphérique, créez et exécutez l'extension de l'application en modifiant le schéma en extension de l'application.

Apple a une documentation directement liée au débogage, au profilage et au test de l'extension de votre application.

1
Michael

Pour surmonter tous les états causés par l'évolution constante de l'EDI, j'utilise la console iOS de lemonjar.com. Elle affiche une fenêtre de console pour tout périphérique iOS connecté rendant les messages syslog, quel que soit l'ID de processus. Vous pouvez voir les messages du journal de débogage des applications et des extensions en même temps ici.

0
igraczech

Depuis Xcode 6 Bêta 5, j'ai pu utiliser un appareil sous iOS8 pour déboguer mon extension. Essayez de l’exécuter sur un périphérique et sélectionnez Safari pour le lancer.

0
Rich86man

Vous devez savoir que l'application de conteneur et l'extension sont deux processus totalement différents dans iOS, tandis que la LLVM ne débogue que l'un après l'autre. Ainsi, lorsque vous déboguez, la console ne consigne jamais l'extension et ne s'arrête jamais au point d'arrêt.

Vous pouvez résoudre la plupart des problèmes avec la méthode de @Vince Yuan.

Cependant, mon problème est que le débogueur Xcode n'accroche pas très bien mon extension clavier à la fois sur le simulateur iOS et les périphériques, comme une fois sur 7-8, c'est totalement une question de probabilité. La méthode de @Vince Yuan fonctionne aussi parfois.

Ma petite expérience est que, lorsque vous exécutez votre schéma de débogage, si la session de débogage dans le panneau de gauche indique "Pas de session de débogage", il n’est pas nécessaire d’ouvrir votre extension et de la tester, le débogueur ne s’est pas connecté, il suffit de lancer encore une fois pour la chance.

mais lorsque vous voyez com.xxx.xxx.xxx en attente d'attachement, l'extension peut définitivement être déboguée.

C'est un petit truc pour qui ne peut pas déboguer une extension iOS, en particulier une extension clavier.

0
Henry

Je pourrais déboguer mon extension avec la façon dont je décris ci-dessous:

  1. Xcode: Debug -> Attach to process by PID or Name. Votre nom de schéma d'extension.
  2. Puis sélectionnez votre main app target et courir.

J'espère que cela fonctionne aussi pour vous les gars.

0
abdullahselek

Clairement, quelque chose est cassé dans Xcode6-B5.

Si j'essaie d'exécuter une extension Photo sur le simulateur, je ne peux pas voir Photos.app en tant qu'option pour le processus de connexion d'extension.

debug options within simulator

Les mêmes, fonctionnant sur un périphérique réel, me donnent le comportement correct.

debug options withing a real device

Dans le premier cas, aucun point d'arrêt n'est honoré. Dans ce dernier cas, les points d'arrêt fonctionnent à merveille.

0
valvoline