Раскадровка iOS9 что такое необработанное действие (handleNonLaunchSpecificActions)?

84

Я заметил, что следующая ошибка появляется в консоли при запуске моего приложения на iOS 9 при использовании раскадровки. Я использую xCode7. Это то, о чем мне нужно беспокоиться?

-[UIApplication _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion:] ** unhandled action -> <FBSSceneSnapshotAction: 0x176bfb20> {
    handler = remote;
    info = <BSSettings: 0x176a5d90> {
        (1) = 5;
    };
}
Алекс Стоун
источник
Apple говорит, что iOS 9 - это стабильность, поэтому я думаю, вам не стоит беспокоиться ;-) PS У меня такая же проблема, и у некоторых других разработчиков тоже stackoverflow.com/questions/32344082/…
Рома
11
Не уверен, что это связано с раскадровкой, я тоже вижу это в моем приложении, не относящемся к раскадровке.
Коэн
Есть ли еще какие-то предупреждения в сборке? Может, это предупреждение кажется банальным?
Джо Сусник
Я не использую раскадровки и тоже получаю это предупреждение. Оно появляется, когда вы блокируете симулятор с помощью CMD + L, а затем «сдвиньте, чтобы разблокировать», чтобы вернуться в приложение.
SDW,
Глядя на журнал устройства, можно предположить, что это как-то связано с автоматическим отключением экрана устройства. Строка SpringBoard[54] <Warning>: [MPUSystemMediaControls] Disabling lock screen media controls updates for screen turning off.регистрируется прямо перед указанным сообщением об ошибке.
Кристиан

Ответы:

32

В вашем коде нет ничего плохого. Это внутреннее сообщение журнала Apple, и вы должны сообщить об этом.

Есть два подсказки, которые показывают, что это, вероятно , код Apple:

  1. Подчеркивание перед именем метода _handleNonLaunchSpecificActions:forScene:withTransitionContext:completionявляется соглашением, указывающим, что метод является частным / внутренним по отношению к классу, в котором он объявлен. (См. Этот комментарий .)

  2. Разумно предположить, что двухбуквенный префикс в FBSSceneSnapshotActionявляется сокращением для FrontBoard, который, согласно Рене Ричи в « iOS 9 wish-list: Guest Mode», является частью всего семейства программного обеспечения, связанного с запуском приложений:

В iOS 8 Apple переделала свой системный менеджер SpringBoard на несколько более мелких и более сфокусированных компонентов. В дополнение к BackBoard, который уже был выделен для обработки фоновых задач, они добавили Frontboard для задач переднего плана. Они также добавили PreBoard для обработки экрана блокировки в безопасных зашифрованных условиях. [...]

Понятия не имею, для чего BSнужен префикс BSSettings, но

BSявляется сокращением для BackBoard Settings, и анализ этого сообщения журнала покажет, что это не то, что вы делали, и вам следует заполнить радар с шагами для воспроизведения сообщения журнала.

Если вы хотите попытаться получить трассировку стека, вы можете реализовать категорию, указанную здесь . Некоторые утверждают, что переопределение частного API - плохая идея, но в этом случае временная инъекция для захвата трассировки стека не может быть слишком вредной.

РЕДАКТИРОВАТЬ:

Но мы все еще хотим знать, что это за действие. Итак, я поставил точку останова -[UIApplication _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion]и начал распечатывать значения регистров и нашел класс с именем, у FBSceneImplкоторого была целая куча информации о моем приложении:

Сцена

Мы можем узнать, какой закрытый метод вызывается следующим (хранится в счетчике программы, указателе инструкции, регистре 15.)

Счетчик команд

Я попытался найти необработанные, FBSceneSnapshotActionупомянутые в журнале, но без кубиков. Затем я разделил UIApplication на подклассы и переопределил _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion. Теперь я мог напрямую перейти к действию, но до сих пор мы не знаем, что это такое.

Затем я снова посмотрел на FBSceneSnapshotAction. Оказывается, у него есть суперкласс BSAction.

Затем я написал инструмент, похожий на RuntimeBrowser, и просмотрел все подклассы BSAction. Оказывается, их довольно много:

Список действий

Два имени методов, которые у нас есть (одно из журнала и одно из счетчика программ на устройствах), указывают на то, что эти действия используются для передачи действий по системе.

Некоторые действия, вероятно, отправляются обратным вызовам делегата приложения, в то время как другие обрабатываются внутри.

Здесь происходит действие, которое не было обработано правильно, и система это замечает. Очевидно, мы не должны были этого видеть.

Моше
источник
Хорошее расследование, но вот кое-что интересное. Я получаю точную ошибку OP при использовании частного API Apple. Думаю, поскольку я использую частный API, я получаю журнал консоли, вероятно, для инженеров Apple.
OhadM
1
@Moshe Сколько Apple заплатила вам за расследование от их имени? Но, возможно, им это не интересно. : p
codelearner
Что значит "подать радар об этом"?
Пол Масри-Стоун
Это означает подать отчет об ошибке с помощью инструмента Apple для сообщения об ошибках.
Моше
12

AFAIK, приведенная выше информация относится к iOS во время снимка экрана (я полагаю, для поведения, связанного с двойным щелчком домашней многозадачности). Я глубоко исследовал свое приложение и, похоже, оно не имеет побочного поведения. Пока вы можете спокойно игнорировать это.

Вы можете использовать следующую простую категорию, чтобы проверить себя на вызовы вышеуказанной функции:

вальволин
источник
1

Я понял, это произойдет, если у вас есть метод IBAction, объявленный в файле .h или .m, но вы не привязываете его к какому-либо элементу управления.

.m пример:

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

но не назначил этот метод ни одному элементу управления в раскадровке.

Сима Шарма
источник
В моем приложении этого нет - у меня нет несвязанных IBActions, и я тоже получаю это сообщение. Однако мое приложение - это приложение Swift.
henrikstroem
1

не выяснил, почему это происходит в моем приложении, но, по крайней мере, вы можете поймать исключение, если хотите, чтобы оно не появлялось в панели журнала. Это не решение, но оно может дать вам более полное представление о том, почему это происходит, путем проверки любого из аргументов, переданных в catch.

быстрая 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")
    }
}
Марк Д.
источник