Błąd: _handleNonLaunchSpecificActions w iOS9


157

W systemie iOS 9 pojawia się następujący błąd:

    -[UIApplication_handleNonLaunchSpecificActions:
      forScene:
      withTransitionContext:
      completion:] unhandled action -> 
      <FBSSceneSnapshotAction: 0x150b2aef0> 
       {
            handler          = remote;
            info = <BSSettings: 0x15333f650> 
            {
                (1) = 5;
            };
        }

Czy ktoś jeszcze natknął się na ten błąd lub jego konsekwencje? Co jest nie tak?


6
Nadal jest w wydaniach post beta iOS9. Dobrze byłoby zrozumieć, na czym polega problem i jakie są jego konsekwencje.
Roddy,

11
Mam ten sam problem, gdy blokuję iPhone'a, gdy moja aplikacja jest uruchomiona. iOS 9.0, XCode 7.0.
NKorotkov

5
Wydaje się, że jest to błąd Apple, ponieważ zupełnie nowy projekt utworzony za pomocą Xcode 7 ma również ten problem.
Hongfei

12
Czy kiedykolwiek dyskutowano na forach deweloperów Apple o jakichkolwiek wartościach? Wygląda na to, że jakikolwiek błąd zamyka się pytaniem „dlaczego miałbyś to robić, skoro Apple tego nie chce?” To ostatni przystanek w desperacji, gdy szukasz rozwiązania problemów.
Roddy

11
Zapoznaj się z pytaniem stackoverflow.com/questions/32658037/ ... - to omawia ten sam problem.
iPhone Guy

Odpowiedzi:


10

Nie ma nic złego w Twoim kodzie. To jest komunikat logowania wewnętrzny firmy Apple i należy złożyć o tym radar.

Istnieją dwie wskazówki, które pokazują, że jest to prawdopodobnie kod Apple:

  1. Podkreślenie prowadzące do nazwy metody _handleNonLaunchSpecificActions:forScene:withTransitionContext:completionjest konwencją wskazującą, że metoda jest prywatna / wewnętrzna klasy, w której została zadeklarowana. (Zobacz ten komentarz ).

  2. Można się domyślić, że dwuliterowy prefiks w FBSSceneSnapshotActionjest skrótem dla FrontBoard, który według Rene Ritchie w „ iOS 9 Wish-list: Guest Mode” jest częścią całej rodziny programów związanych z uruchamianiem aplikacji:

Wraz z iOS 8 Apple przerobił swojego menedżera systemu, SpringBoard, na kilka mniejszych, bardziej ukierunkowanych komponentów. Oprócz BackBoard, który został już wydzielony do obsługi zadań w tle, dodali Frontboard dla zadań pierwszego planu. Dodali również PreBoard do obsługi ekranu blokady w bezpiecznych, zaszyfrowanych warunkach. […]

Nie mam pojęcia, do czego służy ten BSprefiks BSSettings, ale analiza tego komunikatu dziennika wskazywałaby, że nie jest to nic, co zrobiłeś, i powinieneś złożyć radar z krokami, aby odtworzyć komunikat logowania.

Jeśli chcesz spróbować pobrać ślad stosu, możesz zaimplementować kategorię, do której link jest tutaj . Niektórzy twierdzą, że nadpisywanie prywatnego interfejsu API to zły pomysł, ale w tym przypadku tymczasowy zastrzyk w celu pobrania śladu stosu nie może być zbyt szkodliwy.

EDYTOWAĆ:

Ale nadal chcemy wiedzieć, na czym polega ta akcja. Ustawiłem więc punkt przerwania -[UIApplication _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion]i zacząłem drukować wartości rejestrów i znalazłem klasę, FBSceneImplktóra zawierała całą masę informacji o mojej aplikacji:

Scena

Jesteśmy w stanie dowiedzieć się, która metoda prywatna jest wywoływana jako następna (zapisana w liczniku programu, rejestr 15.)

Licznik programu

Próbowałem znaleźć nieobsługiwane FBSceneSnapshotActionodniesienia w dzienniku, ale bez kości. Następnie podklasowałem UIApplication i przesadziłem _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion. Teraz udało mi się przejść bezpośrednio do akcji, ale nadal nie wiemy, co to jest.

Następnie ponownie spojrzałem na FBSceneSnapshotAction. Okazuje się, że ma nadklasę zwaną BSAction.

Następnie napisałem narzędzie podobne do RuntimeBrowser i sprawdziłem wszystkie podklasy BSAction. Okazuje się, że jest ich całkiem spora lista:

Lista czynności

Dwie nazwy metod, które mamy (jedna z dziennika i jedna z licznika programu na urządzeniach) wskazują, że te akcje są używane pod maską do przekazywania akcji w systemie.

Niektóre akcje są prawdopodobnie wysyłane do wywołań zwrotnych delegata aplikacji, podczas gdy inne są obsługiwane wewnętrznie.

To, co się tutaj dzieje, polega na tym, że istnieje akcja, która nie została poprawnie obsłużona, a system to zauważa. Najwyraźniej nie mieliśmy tego widzieć.


Przepraszam, ale to nie jest tak naprawdę odpowiedź; więcej następującego komentarza. Kod jest w dużej mierze wewnętrznym błędem Apple, nie podlega to dyskusji. Domysły nie są tak naprawdę rozwiązaniem, a podane wyjaśnienie iOS8 nie ma znaczenia, ponieważ błąd pojawił się tylko w iOS9 (nie dzieje się tak w iOS8).
Roddy

2
Odpowiedź na pytanie „co jest nie tak” jest taka, że ​​coś wewnątrz SpringBoard nie obsłużyło akcji migawki. Tak mówi komunikat logowania. Niewiele więcej osób poza Apple może ci powiedzieć.
Moshe

Fakt, że ten komunikat logowania nie pojawił się na iOS 8, nie ma jednak znaczenia. To zbłąkany komunikat logowania, który powinien zostać przesłany do radaru.
Moshe

Zauważyłem dziś rano, że ktoś zaktualizował moje pytanie i nie o to pierwotnie pytałem, dlatego jest trochę rozłączny. Nie wiedział nawet, że ktoś może zaktualizować pytanie.
Roddy,

Odpowiadając na Twoje pierwotne pytanie: nie ma żadnych innych konsekwencji niż zgłoszenie radaru.
Moshe
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.