Ошибка: _handleNonLaunchSpecificActions в iOS9

Я получаю следующую ошибку в iOS 9:

    -[UIApplication_handleNonLaunchSpecificActions:
      forScene:
      withTransitionContext:
      completion:] unhandled action -> 
      <FBSSceneSnapshotAction: 0x150b2aef0> 
       {
            handler          = remote;
            info = <BSSettings: 0x15333f650> 
            {
                (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, но анализ этого сообщения в журнале означает, что он ничего не сделал, и вы должны подать радар с шагами для воспроизведения сообщения регистрации.

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

EDIT:

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

Сцена

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

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

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

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

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

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

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

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

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