iOS 9 розкадровка, що таке необроблені дії (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
Не впевнений, що це пов’язано з Storyboards, я бачу це теж у своєму додатку, який не є Storyboard.
koen

Чи є інші попередження у збірці? Можливо, це попередження, яке здається дріб’язковим?
Джо Суснік,

Я не використовую розкадровки, а також отримую це попередження. Він з’являється, коли ви замикаєте симулятор 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: Гість", є частиною всієї родини програмного забезпечення, що стосується запуску програм:

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

Я не уявляю, для чого призначений BSпрефікс in BSSettings, але

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

Якщо ви хочете спробувати захопити трасування стека, ви можете реалізувати категорію, зв’язану з цим . Деякі стверджують, що перевизначення приватного API - це погана ідея, але в цьому випадку тимчасова ін’єкція для захоплення трасування стека не може бути надто шкідливою.

РЕДАГУВАТИ:

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

Сцена

Ми можемо з’ясувати, який приватний метод називається наступним (зберігається в лічильнику програми, вказівнику інструкцій, реєстрі 15.)

Лічильник програм

Я спробував знайти необроблені FBSceneSnapshotActionпосилання в журналі, але жодних кубиків. Потім я підкласифікував UIAплікацію та перевизначив _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{
}

але цей метод не призначений жодному елементу керування в раскадровці.


Це не так у моєму додатку - у мене немає необмежених IBA-дій, і я також отримую це повідомлення. Мій додаток - це програма Swift.
henrikstroem

1

не з’ясував, чому це відбувається в моєму додатку, але принаймні ви можете вловити виняток, якщо хочете, щоб це не з’являлось у вашій області журналу. Це не рішення, але це може дати вам більше розуміння, чому це відбувається, перевіряючи будь-який з аргументів, переданих у ловлі.

версія 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")
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.