Storyboard iOS9 Co to jest nieobsłużona akcja (handleNonLaunchSpecificActions)?

84

Zauważyłem następujący błąd pojawiający się w konsoli podczas uruchamiania mojej aplikacji na iOS 9 podczas korzystania ze scenorysu. Używam xCode7. Czy jest to coś, czym powinienem się martwić?

-[UIApplication _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion:] ** unhandled action -> <FBSSceneSnapshotAction: 0x176bfb20> {
    handler = remote;
    info = <BSSettings: 0x176a5d90> {
        (1) = 5;
    };
}
Alex Stone
źródło
Apple mówi, że iOS 9 to stabilność, więc myślę, że nie powinieneś się martwić ;-) PS Mam ten sam problem i kilku innych deweloperów też stackoverflow.com/questions/32344082/…
Roma
11
Nie jestem pewien, czy jest to związane ze scenorysami, widzę to również w mojej aplikacji innej niż Storyboard.
koen
Czy w kompilacji są jakieś inne ostrzeżenia? Może to ostrzeżenie, które wydaje się trywialne?
Joe Susnick
Nie używam scenorysów i otrzymuję to ostrzeżenie. Pojawia się po zablokowaniu symulatora za pomocą CMD + L, a następnie „przesuń, aby odblokować”, aby wrócić do aplikacji.
SDW,
Patrząc na dziennik urządzenia, może to mieć coś wspólnego z automatycznym wyłączaniem ekranu urządzenia. Linia SpringBoard[54] <Warning>: [MPUSystemMediaControls] Disabling lock screen media controls updates for screen turning off.jest rejestrowana tuż przed cytowanym komunikatem o błędzie.
Christian

Odpowiedzi:

32

Nie ma nic złego w Twoim kodzie. To jest komunikat logowania wewnętrzny firmy Apple i należy złożyć w tej sprawie 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 jest 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 oprogramowania związanego z uruchamianiem aplikacji:

Wraz z iOS 8 Apple przebudował 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 do zadań pierwszoplanowych. Dodali również PreBoard, aby obsługiwać ekran blokady w bezpiecznych, zaszyfrowanych warunkach. […]

Nie mam pojęcia, do czego służy BSprzedrostek w BSSettings, ale

BSjest skrótem BackBoard Settings, a 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 znajduje się 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 (przechowywana w liczniku programu, wskaźniku instrukcji, rejestrze 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ć.

Mosze
źródło
Niezłe dochodzenie, ale tutaj jest coś interesującego, otrzymuję dokładny błąd OP podczas korzystania z prywatnego interfejsu Apple API. Wydaje mi się, że ponieważ używam prywatnego interfejsu API, otrzymuję dziennik konsoli prawdopodobnie dla inżynierów Apple.
OhadM
1
@Moshe Ile zapłacił Ci Apple za zbadanie sprawy w ich imieniu? Ale mogą nie być tym zainteresowani. : p
codelearner
Co to znaczy „zgłoś to na radar”?
Paul Masri-Stone
Oznacza to zgłoszenie błędu za pomocą narzędzia do zgłaszania błędów firmy Apple.
Moshe
12

AFAIK, powyższe informacje są związane z iOS podczas tworzenia migawki ekranu (przypuszczam, że w przypadku zachowania związanego z wielozadaniowością podwójnego kliknięcia w domu) Dogłębnie zbadałem moją aplikację i wydaje się, że nie ma żadnych zachowań pobocznych. Na razie możesz go bezpiecznie zignorować.

Możesz użyć poniższej prostej kategorii, aby sprawdzić się pod kątem wywołań powyższej funkcji:

valvoline
źródło
1

Rozgryzłem to, stanie się tak, gdy masz zadeklarowaną metodę IBAction w pliku .h lub .m, ale nie przypisałeś jej żadnej kontroli.

Przykład .m:

- (IBAction)click:(id)sender{
}

ale nie przypisano tej metody do żadnej kontrolki w scenorysie.

Seema Sharma
źródło
Tak nie jest w mojej aplikacji - nie mam żadnych niezwiązanych IBActions i otrzymuję również tę wiadomość. Moja aplikacja to jednak Swift.
henrikstroem
1

nie dowiedziałem się, dlaczego tak się dzieje w mojej aplikacji, ale przynajmniej możesz złapać wyjątek, jeśli chcesz, aby ten nie pojawiał się w panelu dziennika. To nie jest rozwiązanie, ale może dać ci więcej wglądu, dlaczego tak się dzieje, sprawdzając dowolny z argumentów przekazanych w haczyku.

wersja swift 2:

import UIKit

extension UIApplication {
    func _handleNonLaunchSpecificActions(arg1: AnyObject, forScene arg2: AnyObject, withTransitionContext arg3: AnyObject, completion completionHandler: () -> Void) {
        //whatever you want to do in this catch
        print("handleNonLaunchSpecificActions catched")
    }
}
Marc D.
źródło