- (void)viewDidLoad
{
NSLog(@"%s", __func__);
// ...
}
in viewDidLoad
einer iOS 8- Erweiterung . die NSLog
gibt nichts in Xcode aus.NSLog
funktioniert aber wie gewohnt in der Container App.
Wie kann ich Debug-Nachrichten von einer Erweiterung ausgeben?
ios
ios8
xcode6
ios-app-extension
Oh ho
quelle
quelle
Antworten:
Schritte zum Debuggen einer App-Erweiterung:
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.
Stoppen Sie die Container-App. Dieser Schritt ist wichtig, wenn Sie im Simulator debuggen. Wenn Sie dies nicht tun, teilt Xcode Ihnen mit, dass der Simulator verwendet wird.
Drücken Sie in Xcode auf Menü Debuggen -> An Prozess anhängen -> Nach Prozesskennung (PID) oder Name ... und geben Sie die Kennung der App ext ein, z. B. 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.)
Öffnen Sie im Gerät oder Simulator Ihre App-Erweiterung.
Aktualisierungen am 23. August 2014:
Ich habe festgestellt, dass die obigen Debugging-Schritte unter Xcode 6 Beta 6 mit iOS 8 SDK Beta 5 im Simulator nicht gut funktionieren.
Lösung:
Die Haltepunkte funktionieren. Ich weiß jedoch nicht, warum Protokolle nicht im Ausgabefenster angezeigt werden.
quelle
Ich habe auch dieses Problem. Es funktioniert bei mir, wenn Sie in Ihrem Simulator unter dem Menü Debug -> Systemprotokoll öffnen ...
Von hier aus können Sie alle Protokolle des iPhone Simulators anzeigen (einschließlich der Protokolle Ihrer Erweiterung).
quelle
NSLog
funktioniert perfekt .Sie sehen nur nicht, was im Debug-Bereich von Xcode protokolliert wird, da der Xcode-Debugger nicht an Ihre Erweiterung angehängt ist. Erweiterungen sind nahezu unabhängig von ihrer enthaltenen App. Sie haben beispielsweise separate Bundle-IDs und sind auch separate Prozesse auf dem Betriebssystem.
Ich hatte unterschiedliche Erfolge darin, Xcode an Erweiterungen anzuhängen. Angeblich scheint es, dass es automatisch angehängt wird, und es erscheint im Debug-Navigator als "Warten auf Anhängen", wird aber nie angehängt.
Manchmal kann ich mein Erweiterungsziel in Xcode ausführen:
Und dann haben Sie die Möglichkeit zu wählen, in welcher Anwendung meine Erweiterung ausgeführt werden soll. In diesem Fall würde ich die Empfehlung "Heute" wählen, bei der es sich um ein Benachrichtigungscenter handelt.
Und dann hat es manchmal den Debugger an meine Erweiterung angehängt. Beachten Sie, dass diese Methode anscheinend nur auf physischen Geräten funktioniert.
Wenn es nicht angehängt wird, können Sie die manuelle Anhangsmethode in der Antwort von @ VinceYaun verwenden.
Ich hatte auch unterschiedliche Erfolge mit anderen Bindungsmethoden. Die meisten waren erfolglos und es scheint, dass es sich nur um Fehler handelt, 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 die Antwort von @ BalestraPatrick verwenden .Einige der Fehler wurden in Beta 2 behoben, und ich vermute, dass der Debugger beim Starten der Erweiterung möglicherweise automatisch angehängt wird.
Update: In der iOS 8 Beta 4 Release Notes :
quelle
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, funktionieren zumindest Haltepunkte wie ein Zauber:
quelle
Es funktioniert bei mir :)
quelle
NSLog
funktioniert nur, wenn Sie die Container-App ausführen. Es funktioniert nicht , wenn Sie die App-Erweiterung anstelle des Containers ausführen.Xcode 8 kann Erweiterungen debuggen:
Ergebnis: Haltepunkte und Protokoll funktionieren wie gewohnt.
quelle
Was mir schließlich erlaubt hat, das Protokoll im Debugging-Bereich zu sehen, basierend auf Michaels Vorschlag und Apples Dokumentation , ist:
Erstellen und Ausführen der App-Erweiterung im Simulator. Wenn Sie zur Eingabe einer Host-App aufgefordert werden, wählen Sie die spezifische 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 Leute zu folgen, Today als Host zu verwenden, dann aber diese App zu verlassen und zu Safari zu gehen, um meine Nebenstelle anzurufen. Ich muss meine enthaltene App nicht mehr zuerst ausführen, bevor ich die Erweiterung ausführen kann.
Aus Apples Dokumentation:
quelle
Ich habe die Protokolle tatsächlich ganz einfach in Xcode 6.3 laufen lassen. Erstellen und führen Sie zunächst die enthaltene App aus. Sobald 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 verfügt über eine Dokumentation, die in direktem Zusammenhang mit dem Debuggen, Profilieren und Testen Ihrer App-Erweiterung steht.
quelle
Ein Trick, der für mich funktioniert (obwohl er ziemlich hässlich ist), besteht darin,
UILabel
irgendwo in der unteren Ecke meiner Erweiterung einen Dummy zu platzieren . Normalerweise nenne ich eslogLabel
. 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 natürlich ist Ihre Benutzeroberfläche unübersichtlich.Wenn Sie jedoch ein ziemlich einfaches Widget haben und sich nicht um leichte Unordnung in 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.
quelle
Das Debuggen funktioniert bei mir nur, indem Sie Debug->> An Prozess nach PID oder Name anhängen auswählen. Geben Sie dann die PID ein, nicht den Namen der Erweiterung. 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 Nummer. Das ist die PID
Ich habe auch eine Reihe von NSLogs in die Erweiterung eingefügt, um auch die PID zu finden. Dies ist auf xCode 7
quelle
Stoßen Sie auf dasselbe Problem bezüglich der Erweiterung für
NSLog
und Haltepunkte. Ich habe es mit vielen Tagen gekämpft.Device log
kann wie folgt gefunden werden. Es ist beiXCode -> Window -> Devices and Simulators
.Nach der Eingabe von
Open Console
befindet sich oben rechts im Dialogfeld ein Suchfeld. Ich kann dort Filterregeln anwenden. Beispielsweise enthält ein Prozessname einNotification
Schlüsselwort, oder der Prozessname muss dem Namen des Erweiterungsziels entsprechen, z. B. demMyNotificationServiceExtension
Prozessnamen.quelle
In Xcode6-B5 ist eindeutig etwas kaputt.
Wenn ich versuche, eine Fotoerweiterung im Simulator auszuführen, kann ich keine Photos.app als Option für das Anhängen der Erweiterung sehen.
Das gleiche, das auf einem realen Gerät ausgeführt wird, gibt mir das richtige Verhalten.
Im ersten Fall wird kein Haltepunkt berücksichtigt. Im letzteren Fall wirken Haltepunkte wie ein Zauber.
quelle
Sie sollten wissen, dass die Container-App und -Erweiterung in iOS zwei Unterschiede darstellen, 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 Methode von @Vince Yuan lösen.
Mein Problem ist jedoch, dass der Xcode-Debugger meine Tastaturerweiterung sowohl auf dem iOS-Simulator als auch auf Geräten kaum einbindet, wie 1 Mal in 7-8 Läufen. Es ist eine Frage der Wahrscheinlichkeit. Die Methode von @Vince Yuan funktioniert auch nur manchmal.
Meine kleine Erfahrung ist, dass wenn Sie Ihr Debug-Schema ausführen und die Debug-Sitzung im linken Bereich "Keine Debug-Sitzung" anzeigt, es nicht erforderlich ist, Ihre Erweiterung zu öffnen und zu testen, der Debugger sich nicht angeschlossen hat, sondern nur ausgeführt wird wieder zum Glück.
Wenn Sie jedoch sehen, dass com.xxx.xxx.xxx auf das Anhängen wartet, kann die Erweiterung definitiv debuggt werden.
Dies ist ein kleiner Trick, für den die iOS-Erweiterung, insbesondere die Tastaturerweiterung, nicht debuggt werden kann.
quelle
Ab Xcode 6 Beta 5 konnte ich ein tatsächliches 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
quelle
Um alle Zustände zu überwinden, die durch eine sich ständig ändernde IDE verursacht werden, verwende ich die iOS-Konsole vonitronejar.com. Sie zeigt ein Konsolenfenster für jedes verbundene iOS-Gerät an, das Syslog-Nachrichten unabhängig von der Prozess-ID rendert. Hier können Sie sowohl App- als auch Erweiterungs-Debug-Protokollnachrichten gleichzeitig anzeigen.
quelle
Ich könnte meine Erweiterung mit der folgenden Beschreibung debuggen:
Debug
->Attach to process by PID or Name
. Der Name Ihres Erweiterungsschemas.main app target
und laufen.Ich hoffe es funktioniert auch für euch.
quelle