web-dev-qa-db-de.com

Wie kann ich iOS 8-Erweiterungen mit NSLog debuggen?

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

in viewDidLoad eines iOS 8 Erweiterung. Das NSLog gibt in Xcode nichts aus. NSLog funktioniert jedoch wie gewohnt in der Container-App.

Wie kann ich Debug-Meldungen von einer Erweiterung ausgeben lassen?

87
ohho
  1. Das Debuggen funktioniert für App-Erweiterungen.
  2. Es funktioniert auch im Simulator.
  3. Wenn Ihre App Ext im Simulator abstürzt, ist es möglicherweise nicht einfach, Ihre App Ext neu zu starten. Ein Neustart Ihres Simulators ist eine schnelle Lösung.
  4. Schritte zum Debuggen einer App-Erweiterung:

    1. Führen Sie die Container-App aus. In diesem Schritt lädt Xcode die Container-App und die App-Erweiterung auf das Gerät oder den Simulator hoch.

    2. Stoppen Sie die Container-App. Dieser Schritt ist wichtig, wenn Sie im Simulator debuggen. Wenn Sie dies nicht tun, teilt Ihnen Xcode mit, dass der Simulator verwendet wird.

    3. Drücken Sie in Xcode das Menü Debug -> An Prozess anhängen -> Nach Prozesskennung (PID) oder Name ..., und geben Sie die Kennung der App Ext. Ein, z. com.abc.ContainerApp.MyExtension, um das Debuggen zu starten. Vergessen Sie nicht, Haltepunkte zu setzen. (Update am 25. August 2014: Sie können MyExtension (den Namen Ihrer Erweiterung) direkt eingeben.)

    4. Öffnen Sie im Gerät oder Simulator Ihre App-Erweiterung.


Updates am 23. August 2014:

Ich fand, dass die obigen Debugging-Schritte auf Xcode 6 Beta 6 mit iOS 8 SDK Beta 5 auf dem Simulator nicht gut funktionieren.

Lösung:

  1. Führen Sie Ihre Erweiterung im Simulator aus.
  2. Xcode-Menü Debuggen -> An Prozess anhängen -> Wählen Sie "MyExtension (der Name Ihrer Erweiterung)" im Abschnitt "System" im Menü.

Die Haltepunkte funktionieren. Aber ich weiß nicht, warum Protokolle nicht im Ausgabefenster angezeigt werden.

95
Vince Yuan

Ich habe auch dieses Problem. Es funktioniert für mich, wenn Sie in Ihrem Simulator unter dem Menü Debug -> Open System Log ... gehen.

Von hier aus können Sie alle Protokolle des iPhone Simulators anzeigen (einschließlich der Protokolle Ihrer Erweiterung).

enter image description here

49
BalestraPatrick

NSLog funktioniert perfekt.

Sie können nur nicht sehen, was im Debug-Bereich von Xcode protokolliert wird, da der Xcode-Debugger nicht an Ihre Erweiterung angehängt ist. Erweiterungen sind fast völlig unabhängig von der enthaltenen App. Sie haben z. B. separate Bündel-IDs und sind auch separate Prozesse auf dem Betriebssystem.

Ich hatte verschiedene Erfolge damit, Xcode an Erweiterungen anzuhängen. Angeblich wird es automatisch angehängt, und im Debug-Navigator wird es als "Warten auf Anfügung" angezeigt, aber nie angehängt.

Manchmal kann ich mein Erweiterungsziel in Xcode ausführen:

enter image description here

Und dann haben Sie die Möglichkeit, auszuwählen, in welcher Anwendung meine Erweiterung ausgeführt werden soll. In diesem Fall würde ich die Empfehlung "Heute" als Benachrichtigungscenter auswählen.

enter image description here

Und dann würde es manchmal den Debugger an meine Erweiterung anhängen. Beachten Sie, dass diese Methode anscheinend nur auf physischen Geräten funktioniert.

Wenn dies nicht der Fall ist, können Sie die manuelle Methode zum Anhängen in der Antwort von @ VinceYaun verwenden.

Ich hatte auch verschiedene Erfolge mit anderen Befestigungsmethoden. Die meisten waren erfolglos und es scheint sich nur um Fehler zu handeln, die zu einem späteren Zeitpunkt behoben werden.

Um Ihre Protokollnachrichten anzuzeigen, gehen Sie zu Window -> Devices in der oberen Leiste und wählen Sie Ihr Gerät aus. Sie können das Geräteprotokoll unten in diesem Fenster aufrufen. Wenn Sie auf einem Simulator testen, können Sie @ BalestraPatricks Antwort verwenden.

Einige der Fehler wurden in Beta 2 behoben, und ich gehe davon aus, dass der Debugger beim Starten der Erweiterung möglicherweise automatisch eine Verbindung herstellt.

Update: In der iOS 8 Beta 4 Versionshinweise :

Erweiterungen

In Beta 4 behoben

  • Erweiterungen können beim Debuggen von Xcode manchmal nicht gestartet werden.
  • Wenn die Erweiterung mit der Benutzeroberfläche beendet wird, wird sie neu gestartet und nicht entlassen.
  • Manchmal kann Ihre Freigabe- oder Aktionserweiterung hängen bleiben.
  • Durch das erneute Bereitstellen einer Erweiterung wird diese möglicherweise im Benachrichtigungscenter deaktiviert.
32
Santa Claus

Ich habe auch dieses Problem. Xcode hängt meinen Debugger niemals an die Erweiterung an oder zeigt NSLog-Nachrichten an. Wenn Sie Ihren Xcode-Debugger manuell an Ihren Erweiterungsprozess anhängen, wirken mindestens Haltepunkte wie ein Zauber:

Debug->Attach to process->Your extension name (mine was "com.example.MyExtensionApp.MyExtension")
18
Masalis
  1. Erstellen Sie ein Schema für Ihre Erweiterung
  2. Schema ausführen
  3. In einem Dialog wählen Sie die Container-App
  4. Genießen

Es funktioniert bei mir :)

12
Maciek Czarnik

Xcode 8 kann Erweiterungen debuggen:

  1. Wählen Sie das Erweiterungsschema in der Combo neben der Stopp-Schaltfläche und führen Sie es aus.
  2. Wählen Sie im angezeigten Dialogfeld die übergeordnete Anwendung aus.

Ergebnis: Haltepunkte und Protokollierung funktionieren wie gewohnt.

4
Jano

Was mir schließlich erlaubt hat, das Protokoll im Debugging-Bereich zu sehen, basierend auf Michaels Vorschlag und Apples Dokumentation , ist:

Erstellen Sie die App-Erweiterung im Simulator und führen Sie sie aus. Wenn Sie zur Eingabe einer Host-App aufgefordert werden, wählen Sie die App aus, von der aus Sie die Erweiterung aufrufen möchten . . In meinem Fall habe ich meine Action-Erweiterung von Safari aus gestartet, indem ich ein Freigabeblatt in einer PDF-Datei aufgerufen habe.

Was vorher nicht funktionierte, war, den Vorschlägen anderer zu folgen, Today als Host zu verwenden, diese App dann zu verlassen und zu Safari zu gehen, um meine Nebenstelle anzurufen. Ich muss nicht einmal mehr meine enthaltene App ausführen, bevor ich die Erweiterung ausführe.

Aus der Dokumentation von Apple:

In der Ausführungsphase Ihres Erweiterungsschemas geben Sie eine Host-App als ausführbare Datei an. Beim Zugriff auf die Erweiterung über die Benutzeroberfläche des angegebenen Hosts wird der Xcode-Debugger mit der Erweiterung verbunden.

4
Andrew

Ein Trick, der für mich funktioniert (obwohl er ziemlich hässlich ist), besteht darin, irgendwo in der unteren Ecke meiner Erweiterung einen Dummy UILabel zu platzieren. Normalerweise nenne ich es logLabel. Es ist dann möglich, den Text dieses Etiketts mit einer beliebigen Protokollanweisung zu aktualisieren, die protokolliert werden soll. Ein solcher Ansatz ist nicht sehr gut, wenn Sie Anweisungen von Instanzen verschiedener Klassen protokollieren müssen. Und offensichtlich überfrachtet es Ihre Benutzeroberfläche.

Wenn Sie jedoch ein recht einfaches Widget haben und sich nicht um ein leichtes Durcheinander der Benutzeroberfläche kümmern, ist dies der Trick. Ich habe alle anderen in dieser Diskussion beschriebenen Lösungen ausprobiert und leider hat keine von ihnen für mich funktioniert.

1

Stellen Sie dasselbe Problem bezüglich der Erweiterung für NSLog und der Haltepunkte fest. Ich habe es mit vielen Tagen gekämpft.

Device log kann wie folgt gefunden werden. Es ist bei XCode -> Window -> Devices and Simulators.

Nach Eingabe des Open Console, oben rechts im Dialogfeld befindet sich ein Suchfeld. Ich kann dort Filterregeln anwenden. Ein Prozessname enthält beispielsweise das Schlüsselwort Notification, oder der Prozessname muss dem Namen des Erweiterungsziels entsprechen, z. B .: entspricht dem Prozessnamen MyNotificationServiceExtension.

Device log

1
AechoLiu

Das Debuggen funktioniert bei mir nur, indem Sie Debug-> An PID oder Namen anhängen auswählen. Geben Sie dann das PID nicht den Erweiterungsnamen ein. Sie finden die PID, indem Sie die Erweiterung auf einem Gerät ausführen. Gehen Sie zu Fenster-> Geräte. Suchen Sie Ihr Gerät und zeigen Sie die Konsole an. Wenn Sie den Namen Ihrer Nebenstelle sehen, folgt eine 5-stellige Zahl. Das ist die PID

Ich habe auch ein paar NSLogs in die Erweiterung eingefügt, um auch die PID zu finden. Dies ist auf xCode 7

1
Tony

Ich habe tatsächlich die Protokolle ganz einfach in Xcode 6.3 ausgeführt. Erstellen Sie zunächst die enthaltene App, und führen Sie sie aus. Wenn die enthaltene App auf dem Gerät ausgeführt wird, erstellen Sie die App-Erweiterung, und führen Sie sie aus, indem Sie das Schema in die App-Erweiterung ändern.

Apple hat eine Dokumentation, die sich direkt auf das Debuggen, Profilieren und Testen Ihrer App-Erweiterung bezieht.

1
Michael

Um alle Zustände zu überwinden, die durch die sich ständig ändernde IDE verursacht werden, verwende ich iOS Console von lemonjar.com. Es zeigt ein Konsolenfenster für alle verbundenen iOS-Geräte an, die Syslog-Nachrichten unabhängig von der Prozess-ID wiedergeben. Hier können Sie die Debug-Protokollnachrichten sowohl für die Anwendung als auch für die Erweiterung gleichzeitig anzeigen.

0
igraczech

Seit Xcode 6 Beta 5 kann ich ein aktuelles Gerät mit iOS8 zum Debuggen meiner Erweiterung verwenden. Versuchen Sie, es auf einem Gerät auszuführen, und wählen Sie Safari zum Starten aus

0
Rich86man

Sie sollten wissen, dass die Container-App und die Erweiterung in iOS zwei völlig unterschiedliche Prozesse sind, während die LLVM jeweils nur einen Thread debuggt. Wenn Sie also debuggen, protokolliert die Konsole die Erweiterung niemals und stoppt niemals am Haltepunkt.

Sie können die meisten Probleme mit der @Vince Yuan-Methode lösen.

Mein Problem ist jedoch, dass der Xcode-Debugger meine Tastaturerweiterung auf iOS-Simulator und -Geräten kaum einbindet. Das ist eine Frage der Wahrscheinlichkeit. @Vince Yuans Methode funktioniert auch manchmal.

Meine kleine Erfahrung ist, dass, wenn Sie Ihr Debug-Schema ausführen, wenn die Debug-Sitzung im linken Fensterbereich 'Keine Debug-Sitzung' anzeigt, Sie Ihre Erweiterung nicht öffnen und testen müssen, der Debugger sich nicht angeschlossen hat, sondern nur ausgeführt wird nochmal zum glück.

aber wenn Sie sehen, dass com.xxx.xxx.xxx auf Attach wartet, kann die Erweiterung definitiv debuggt werden.

Dies ist ein kleiner Trick, für den die iOS-Erweiterung, insbesondere die Tastaturerweiterung, nicht debuggen kann.

0
Henry

Ich könnte meine Erweiterung mit der unten beschriebenen Methode debuggen:

  1. Xcode: Debug -> Attach to process by PID or Name. Name Ihres Erweiterungsschemas.
  2. Dann wähle dein main app target und Renn.

Ich hoffe es funktioniert auch bei euch.

0
abdullahselek

Offensichtlich ist in Xcode6-B5 etwas kaputt.

Wenn ich versuche, eine Photo-Erweiterung auf dem Simulator auszuführen, wird keine Photos.app als Option für das Anhängen der Erweiterung angezeigt.

debug options within simulator

Das gleiche, auf einem realen Gerät ausgeführt, geben Sie mir das richtige Verhalten.

debug options withing a real device

Im ersten Fall wird ein Haltepunkt nicht beachtet. Im letzteren Fall wirken Haltepunkte wie ein Zauber.

0
valvoline