- (void)viewDidLoad
{
NSLog(@"%s", __func__);
// ...
}
w rozszerzeniuviewDidLoad
iOS 8 . wyjść nic w Xcode. działa jednak jak zwykle w aplikacji kontenera.NSLog
NSLog
Jak mogę uzyskać wyniki komunikatów debugowania z rozszerzenia?
- (void)viewDidLoad
{
NSLog(@"%s", __func__);
// ...
}
w rozszerzeniuviewDidLoad
iOS 8 . wyjść nic w Xcode. działa jednak jak zwykle w aplikacji kontenera.NSLog
NSLog
Jak mogę uzyskać wyniki komunikatów debugowania z rozszerzenia?
Odpowiedzi:
Kroki, aby debugować rozszerzenie aplikacji:
Uruchom aplikację kontenera. W tym kroku Xcode przesyła aplikację kontenera i rozszerzenie aplikacji na urządzenie lub symulator.
Zatrzymaj aplikację kontenera. Ten krok jest ważny podczas debugowania w symulatorze. Jeśli tego nie zrobisz, Xcode poinformuje Cię, że symulator jest używany.
W Xcode naciśnij menu Debuguj -> Dołącz do procesu -> Według identyfikatora procesu (PID) lub nazwy ..., wprowadź identyfikator rozszerzenia aplikacji, np. Com.abc.ContainerApp.MyExtension, aby rozpocząć debugowanie. Nie zapomnij ustawić punktów przerwania. (Aktualizacja z 25 sierpnia 2014 r .: możesz bezpośrednio wprowadzić MyExtension (nazwę twojego rozszerzenia).)
Na urządzeniu lub w symulatorze otwórz rozszerzenie aplikacji.
Zauważyłem, że powyższe kroki debugowania nie działają dobrze na Xcode 6 beta 6 z iOS 8 SDK beta 5 na symulatorze.
Rozwiązanie:
Punkty przerwania działają. Ale nie wiem, dlaczego dzienniki nie są wyświetlane w oknie danych wyjściowych.
Ja też mam ten problem. U mnie działa, jeśli przejdziesz do swojego symulatora w menu Debug -> Otwórz dziennik systemu ...
Stąd możesz zobaczyć wszystkie dzienniki iPhone Simulator (w tym dzienniki twojego rozszerzenia).
NSLog
działa idealnie .
Po prostu nie widzisz, co jest rejestrowane w obszarze debugowania Xcode, ponieważ debuger Xcode nie jest dołączony do twojego rozszerzenia. Rozszerzenia są prawie całkowicie niezależne od ich aplikacji. Mają na przykład oddzielne identyfikatory pakietów, a także są oddzielnymi procesami w systemie operacyjnym.
Miałem różne sukcesy w dołączaniu Xcode do rozszerzeń. Podobno wygląda na to, że załączyłby się automatycznie i pojawia się w nawigatorze debugowania jako „Oczekiwanie na dołączenie”, ale nigdy nie jest dołączany.
Czasami mogę uruchomić mój cel rozszerzenia w Xcode:
A potem mam możliwość wyboru aplikacji, w której ma uruchamiać moje rozszerzenie. W tym przypadku wybrałbym jego rekomendację „dzisiaj”, czyli centrum powiadomień.
A potem czasami dołączał debugger do mojego rozszerzenia. Wydaje się, że ta metoda działa tylko na urządzeniach fizycznych.
Jeśli nie dołącza, możesz użyć ręcznej metody mocowania w odpowiedzi @ VinceYaun,
Odniosłem również różne sukcesy, używając innych metod przywiązania. Większość zakończyła się niepowodzeniem i wygląda na to, że są to tylko błędy, które zostaną naprawione w późniejszym terminie.
Aby wyświetlić komunikaty dziennika, przejdź do Window
-> Devices
na górnym pasku i wybierz swoje urządzenie. Możesz wywołać dziennik urządzenia z dołu tego okna. Jeśli testujesz na symulatorze, można użyć @ BalestraPatrick za odpowiedź .
Niektóre błędy zostały naprawione w wersji Beta 2 i przypuszczam, że ostatecznie debugger będzie się automatycznie podłączał podczas uruchamiania rozszerzenia.
Aktualizacja: W iOS 8 Beta 4 informacjach o wydaniu :
Rozszerzenia
Naprawiono w wersji beta 4
- Rozszerzenia czasami nie uruchamiają się podczas debugowania z Xcode.
- Gdy rozszerzenie z interfejsem użytkownika zostanie zabite, uruchamia się ponownie i nie jest odrzucane.
- Czasami rozszerzenie udostępniania lub działania może się zawiesić.
- Ponowne wdrożenie rozszerzenia może spowodować jego wyłączenie w centrum powiadomień.
Ja też mam ten problem. Xcode nigdy nie dołącza mojego debugera do rozszerzenia ani nie wyświetla komunikatów NSLog. Jeśli ręcznie dołączysz debuger Xcode do procesu rozszerzenia, przynajmniej punkty przerwania będą działać jak urok:
Debug->Attach to process->Your extension name (mine was "com.example.MyExtensionApp.MyExtension")
U mnie działa :)
NSLog
będzie działać tylko wtedy, gdy używasz aplikacji kontenera. To nie będzie działać, jeśli używasz App-rozszerzenie zamiast pojemnika.
Xcode 8 może debugować rozszerzenia:
Wynik: punkty przerwania i dziennik działają normalnie.
Co ostatecznie pozwoliło mi zobaczyć dziennik w obszarze debugowania, oparty na sugestii Michaela i dokumentacji Apple , to:
Skompiluj i uruchom rozszerzenie aplikacji w symulatorze, a po wyświetleniu monitu o aplikację hosta wybierz konkretną aplikację, z której chcesz wywołać rozszerzenie . W moim przypadku uruchamiałem rozszerzenie Action z Safari, wyciągając arkusz udostępniania w pliku PDF.
To, co wcześniej nie działało, to podążanie za sugestiami innych osób, aby użyć Today jako gospodarza, ale potem opuściłem tę aplikację i przeszedłem do Safari, aby zadzwonić do mojego rozszerzenia. Nie muszę już nawet uruchamiać mojej aplikacji zawierającej przed uruchomieniem rozszerzenia.
Z dokumentacji Apple:
W fazie uruchamiania schematu rozszerzenia określasz aplikację hosta jako plik wykonywalny. Po uzyskaniu dostępu do rozszerzenia za pośrednictwem interfejsu użytkownika określonego hosta debuger Xcode dołącza do rozszerzenia.
Właściwie uruchomiłem dzienniki po prostu w Xcode 6.3. Po pierwsze, skompiluj i uruchom aplikację zawierającą. Po uruchomieniu aplikacji zawierającej na urządzeniu skompiluj i uruchom rozszerzenie aplikacji, zmieniając schemat na rozszerzenie aplikacji.
Sztuczka, która działa na mnie (choć jest dość brzydka) polega na umieszczeniu manekina UILabel
gdzieś w dolnym rogu mojego przedłużenia. Zwykle to nazywam logLabel
. Możliwe jest wtedy zaktualizowanie tekstu tej etykiety o dowolną instrukcję dziennika, która ma być rejestrowana. Takie podejście nie jest zbyt dobre, jeśli musisz rejestrować instrukcje z instancji różnych klas. I oczywiście zaśmieca twój interfejs użytkownika.
Jeśli jednak masz dość prosty widget i nie przeszkadza ci lekkie zaśmiecenie interfejsu użytkownika, to załatwia sprawę. Wypróbowałem wszystkie inne rozwiązania przedstawione w tej dyskusji i niestety żadne z nich nie zadziałało.
Jedynym sposobem, w jaki działa debugowanie, jest wybranie Debuguj-> Dołącz do procesu przez PID lub nazwę. Następnie wprowadź PID, a nie nazwę rozszerzenia. Możesz znaleźć PID, uruchamiając rozszerzenie na urządzeniu, przejdź do Okno-> Urządzenia. Znajdź swoje urządzenie i wyświetl konsolę. Gdy zobaczysz nazwę swojego numeru wewnętrznego, po niej następuje 5-cyfrowy numer. To jest PID
Umieściłem też kilka NSLog w rozszerzeniu, aby znaleźć również PID. To jest w xCode 7
Napotkaj ten sam problem dotyczący rozszerzenia dla NSLog
i punktów przerwania. Walczyłem z tym przez wiele dni.
Device log
można znaleźć jako poniższy obraz. Jest o godzXCode -> Window -> Devices and Simulators
.
Po wpisaniu w Open Console
prawym górnym rogu okna dialogowego pojawi się pole wyszukiwania. Mogę tam zastosować regułę filtru. Na przykład nazwa procesu zawiera Notification
słowo kluczowe lub nazwa procesu musi być równa nazwie celu rozszerzenia, np. Równa MyNotificationServiceExtension
nazwie procesu.
Najwyraźniej coś jest zepsute w Xcode6-B5.
Jeśli spróbuję uruchomić rozszerzenie Photo w symulatorze, nie widzę aplikacji Photos.app jako opcji procesu dołączania rozszerzenia.
To samo, działając na prawdziwym urządzeniu, daj mi prawidłowe zachowanie.
W pierwszym przypadku żaden punkt przerwania nie jest honorowany. W tym drugim przypadku punkty przerwania działają jak urok.
Powinieneś wiedzieć, że aplikacja kontenera i rozszerzenie to całkowicie dwa różne procesy w iOS, podczas gdy LLVM debuguje tylko wątek na raz, więc podczas debugowania konsola nigdy nie rejestruje rozszerzenia i nigdy nie zatrzymuje się w punkcie przerwania.
Możesz rozwiązać większość problemów metodą @Vince Yuan.
Jednak moim problemem jest to, że debugger Xcode prawie nie podpina mojego rozszerzenia klawiatury zarówno na symulatorze iOS, jak i na urządzeniach, na przykład 1 raz na 7-8 uruchomień, to całkowicie kwestia prawdopodobieństwa. Metoda @Vince Yuan również czasami działa.
Moje małe doświadczenie polega na tym, że po uruchomieniu schematu debugowania, jeśli sesja debugowania w lewym panelu pokazuje `` Brak sesji debugowania '', nie ma potrzeby otwierania rozszerzenia i testowania go, debugger się nie włączył, po prostu uruchom znowu na szczęście.
ale kiedy zobaczysz com.xxx.xxx.xxx czeka na dołączenie, rozszerzenie może z pewnością zostać zdebugowane.
To mała sztuczka, dla której nie można debugować rozszerzenia iOS, zwłaszcza rozszerzenia klawiatury.
Aby przezwyciężyć wszystkie stany spowodowane ciągłymi zmianami IDE, używam konsoli iOS firmy lemonjar.com - wyświetla ona okno konsoli dla dowolnego podłączonego urządzenia z systemem iOS wyświetlającego komunikaty syslog niezależnie od identyfikatora procesu. W tym miejscu możesz zobaczyć jednocześnie komunikaty dziennika debugowania aplikacji i rozszerzenia.
Mogę debugować moje rozszerzenie w sposób opisany poniżej:
Debug
-> Attach to process by PID or Name
. Nazwa Twojego schematu rozszerzenia.main app target
i biegnij.Mam nadzieję, że w was też działa.