Я заметил, что следующая ошибка появляется в консоли при запуске моего приложения на iOS 9 при использовании раскадровки. Я использую xCode7. Это то, о чем мне нужно беспокоиться?
-[UIApplication _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion:] ** unhandled action -> <FBSSceneSnapshotAction: 0x176bfb20> {
handler = remote;
info = <BSSettings: 0x176a5d90> {
(1) = 5;
};
}
error-handling
uistoryboard
ios9
xcode7
transition-coordinator
Алекс Стоун
источник
источник
SpringBoard[54] <Warning>: [MPUSystemMediaControls] Disabling lock screen media controls updates for screen turning off.
регистрируется прямо перед указанным сообщением об ошибке.Ответы:
В вашем коде нет ничего плохого. Это внутреннее сообщение журнала Apple, и вы должны сообщить об этом.
Есть два подсказки, которые показывают, что это, вероятно , код Apple:
Подчеркивание перед именем метода
_handleNonLaunchSpecificActions:forScene:withTransitionContext:completion
является соглашением, указывающим, что метод является частным / внутренним по отношению к классу, в котором он объявлен. (См. Этот комментарий .)Разумно предположить, что двухбуквенный префикс в
FBSSceneSnapshotAction
является сокращением для FrontBoard, который, согласно Рене Ричи в « iOS 9 wish-list: Guest Mode», является частью всего семейства программного обеспечения, связанного с запуском приложений:Понятия не имею, для чегоBS
нужен префиксBSSettings
, ноBS
является сокращением дляBackBoard Settings
, и анализ этого сообщения журнала покажет, что это не то, что вы делали, и вам следует заполнить радар с шагами для воспроизведения сообщения журнала.Если вы хотите попытаться получить трассировку стека, вы можете реализовать категорию, указанную здесь . Некоторые утверждают, что переопределение частного API - плохая идея, но в этом случае временная инъекция для захвата трассировки стека не может быть слишком вредной.
РЕДАКТИРОВАТЬ:
Но мы все еще хотим знать, что это за действие. Итак, я поставил точку останова
-[UIApplication _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion]
и начал распечатывать значения регистров и нашел класс с именем, уFBSceneImpl
которого была целая куча информации о моем приложении:Мы можем узнать, какой закрытый метод вызывается следующим (хранится в
счетчике программы,указателе инструкции, регистре 15.)Я попытался найти необработанные,
FBSceneSnapshotAction
упомянутые в журнале, но без кубиков. Затем я разделил UIApplication на подклассы и переопределил_handleNonLaunchSpecificActions:forScene:withTransitionContext:completion
. Теперь я мог напрямую перейти к действию, но до сих пор мы не знаем, что это такое.Затем я снова посмотрел на FBSceneSnapshotAction. Оказывается, у него есть суперкласс
BSAction
.Затем я написал инструмент, похожий на RuntimeBrowser, и просмотрел все подклассы BSAction. Оказывается, их довольно много:
Два имени методов, которые у нас есть (одно из журнала и одно из счетчика программ на устройствах), указывают на то, что эти действия используются для передачи действий по системе.
Некоторые действия, вероятно, отправляются обратным вызовам делегата приложения, в то время как другие обрабатываются внутри.
Здесь происходит действие, которое не было обработано правильно, и система это замечает. Очевидно, мы не должны были этого видеть.
источник
AFAIK, приведенная выше информация относится к iOS во время снимка экрана (я полагаю, для поведения, связанного с двойным щелчком домашней многозадачности). Я глубоко исследовал свое приложение и, похоже, оно не имеет побочного поведения. Пока вы можете спокойно игнорировать это.
Вы можете использовать следующую простую категорию, чтобы проверить себя на вызовы вышеуказанной функции:
источник
Я понял, это произойдет, если у вас есть метод IBAction, объявленный в файле .h или .m, но вы не привязываете его к какому-либо элементу управления.
.m пример:
но не назначил этот метод ни одному элементу управления в раскадровке.
источник
не выяснил, почему это происходит в моем приложении, но, по крайней мере, вы можете поймать исключение, если хотите, чтобы оно не появлялось в панели журнала. Это не решение, но оно может дать вам более полное представление о том, почему это происходит, путем проверки любого из аргументов, переданных в catch.
быстрая 2 версия:
источник