Storyboard iOS9 cos'è l'azione non gestita (handleNonLaunchSpecificActions)?


84

Ho notato il seguente errore che compare nella console durante l'esecuzione della mia app su iOS 9 quando si utilizza uno storyboard. Sto usando xCode7. È qualcosa di cui devo preoccuparmi?

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

Apple dice iOS 9 è la stabilità, quindi credo che non si deve preoccupare ;-) PS io ho lo stesso problema, e alcuni altri sviluppatori troppo stackoverflow.com/questions/32344082/...
Roma

11
Non sono sicuro che sia correlato agli Storyboard, lo vedo anche nella mia app non Storyboard.
koen

Ci sono altri avvisi nella build? Forse è un avvertimento che sembra banale?
Joe Susnick,

Non sto usando gli storyboard e ricevo anche questo avviso. Si apre quando blocchi il simulatore con CMD + L e poi "scorri per sbloccare" per tornare nell'app.
SDW

Guardando il registro del dispositivo, potrebbe avere qualcosa a che fare con lo spegnimento automatico dello schermo del dispositivo. La riga SpringBoard[54] <Warning>: [MPUSystemMediaControls] Disabling lock screen media controls updates for screen turning off.viene registrata subito prima del messaggio di errore citato.
Christian

Risposte:


32

Non c'è niente di sbagliato nel tuo codice. Questo è un messaggio di registrazione interno ad Apple e dovresti presentare un radar a riguardo.

Ci sono due indizi che mostrano che questo è probabilmente il codice di Apple:

  1. Il carattere di sottolineatura che precede il nome del metodo _handleNonLaunchSpecificActions:forScene:withTransitionContext:completionè una convenzione che indica che il metodo è privato / interno alla classe in cui è dichiarato (vedere questo commento ).

  2. È ragionevole supporre che il prefisso di due lettere FBSSceneSnapshotActionsia l'abbreviazione di FrontBoard, che secondo Rene Ritchie in " Lista dei desideri di iOS 9: modalità ospite" fa parte dell'intera famiglia di software relativi all'avvio di app:

Con iOS 8, Apple ha modificato il suo gestore di sistema, SpringBoard, in diversi componenti più piccoli e più mirati. Oltre a BackBoard, che era già stato scorporato per gestire le attività in background, hanno aggiunto Frontboard per le attività in primo piano. Hanno anche aggiunto PreBoard per gestire la schermata di blocco in condizioni sicure e crittografate. [...]

Non ho idea di cosa sia il BSprefisso in BSSettings, ma

BSè una scorciatoia per BackBoard Settings, e un'analisi di questo messaggio di log indicherebbe che non è niente che hai fatto, e dovresti presentare un radar con i passaggi per riprodurre il messaggio di log.

Se vuoi provare a prendere una traccia dello stack, puoi implementare la categoria collegata qui . Alcuni sostengono che l'override dell'API privata sia una cattiva idea, ma in questo caso un'iniezione temporanea per acquisire una traccia dello stack non può essere troppo dannosa.

MODIFICARE:

Ma vogliamo ancora sapere qual è questa azione. Quindi ho inserito un punto di interruzione -[UIApplication _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion]e ho iniziato a stampare i valori di registro e ho trovato una classe chiamata FBSceneImplche conteneva un sacco di informazioni sulla mia applicazione:

Scena

Siamo in grado di scoprire quale metodo privato viene chiamato successivamente (memorizzato nel contatore del programma, puntatore dell'istruzione, registro 15.)

Contatore di programma

Ho provato a trovare il FBSceneSnapshotActionriferimento non gestito nel registro, ma nessun dado. Quindi, ho sottoclassato UIApplication e ho sovrascritto _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion. Ora sono stato in grado di entrare direttamente in azione, ma ancora non sappiamo cosa sia.

Quindi, ho guardato di nuovo FBSceneSnapshotAction. Si scopre che ha una superclasse chiamata BSAction.

Poi ho scritto uno strumento simile a RuntimeBrowser e ho cercato tutte le sottoclassi di BSAction. Si scopre che ce n'è un bel elenco:

Lista di azioni

I due nomi di metodo che abbiamo (uno dal registro e uno dal contatore del programma sui dispositivi) indicano che queste azioni vengono utilizzate sotto il cofano per passare le azioni nel sistema.

Alcune azioni vengono probabilmente inviate ai callback del delegato dell'app, mentre altre vengono gestite internamente.

Quello che sta succedendo qui è che c'è un'azione che non è stata gestita correttamente e il sistema la sta rilevando. A quanto pare non avremmo dovuto vederlo.


Bella indagine, ma ecco qualcosa di interessante, ottengo l'errore OP esatto quando utilizzo l'API Apple privata. Immagino che dal momento che utilizzo l'API privata, probabilmente ricevo il registro della console per gli ingegneri Apple.
OhadM

1
@Moshe Quanto ti ha pagato Apple per indagare per loro conto? Ma potrebbero non essere interessati a questo. : p
codelearner

Cosa significa "presentare un radar a riguardo"?
Paul Masri-Stone

Significa presentare una segnalazione di bug con lo strumento di segnalazione bug di Apple.
Moshe

12

Per quanto ne so, le informazioni di cui sopra sono relative a iOS durante l'istantanea dello schermo (suppongo per il comportamento correlato al multitasking a casa con doppio clic) Ho studiato a fondo la mia applicazione e sembra che non abbia alcun comportamento laterale. Puoi tranquillamente ignorarlo, per ora.

Puoi utilizzare la seguente categoria semplice per metterti alla prova contro le chiamate alla funzione sopra:


1

Ho capito, accadrà quando hai il metodo IBAction dichiarato nel file .h o .m ma non lo hai associato a nessun controllo.

.m esempio:

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

ma non assegnato questo metodo a nessun controllo nello storyboard.


Questo non è il caso della mia app: non ho azioni IBA non associate e ricevo anche questo messaggio. La mia app è un'app Swift però.
henrikstroem

1

non ho scoperto perché succede nella mia app, ma almeno puoi catturare l'eccezione, se vuoi evitare che appaia nel riquadro del registro. Non è una soluzione, ma potrebbe darti maggiori informazioni sul motivo per cui sta succedendo esaminando uno qualsiasi degli argomenti passati nella cattura.

versione 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")
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.