IOS9 раскадровка, что является необработанным действием (handleNonLaunchSpecificActions)?

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

-[UIApplication _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion:] ** unhandled action -> <FBSSceneSnapshotAction: 0x176bfb20> {
    handler = remote;
    info = <BSSettings: 0x176a5d90> {
        (1) = 5;
    };
}

Ответ 1

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

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

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

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

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

Я понятия не имею, для чего предназначен префикс BS в BSSettings, но

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

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

EDIT:

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

Сцена

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

Счетчик программ

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

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

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

Пример

.m:

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

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

Ответ 4

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

версия 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")
    }
}