Storyboard de iOS9 ¿que es la acción no controlada (handleNonLaunchSpecificActions)?

84

He notado que aparece el siguiente error en la consola al ejecutar mi aplicación en iOS 9 al usar un guión gráfico. Estoy usando xCode7. ¿Es esto algo de lo que debo preocuparme?

-[UIApplication _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion:] ** unhandled action -> <FBSSceneSnapshotAction: 0x176bfb20> {
    handler = remote;
    info = <BSSettings: 0x176a5d90> {
        (1) = 5;
    };
}
Alex Stone
fuente
Apple dice que iOS 9 se trata de estabilidad, así que supongo que no deberías preocuparte ;-) PD: Tengo el mismo problema y algunos otros desarrolladores también stackoverflow.com/questions/32344082/…
Roma
11
No estoy seguro de si está relacionado con Storyboards, también lo veo en mi aplicación que no es Storyboard.
koen
¿Hay otras advertencias en la compilación? ¿Quizás es una advertencia que parece trivial?
Joe Susnick
No estoy usando guiones gráficos y también recibo esta advertencia. Aparece cuando bloquea el simulador con CMD + L y luego "desliza para desbloquear" para volver a la aplicación.
SDW
Al mirar el registro del dispositivo, podría tener algo que ver con apagar automáticamente la pantalla del dispositivo. La línea SpringBoard[54] <Warning>: [MPUSystemMediaControls] Disabling lock screen media controls updates for screen turning off.se registra justo antes del mensaje de error citado.
Christian

Respuestas:

32

No hay nada de malo en tu código. Este es un mensaje de registro interno de Apple, y debe presentar un radar al respecto.

Hay dos pistas que muestran que probablemente este sea el código de Apple:

  1. El guión bajo que encabeza el nombre del método _handleNonLaunchSpecificActions:forScene:withTransitionContext:completiones una convención que indica que el método es privado / interno a la clase en la que está declarado (consulte este comentario ).

  2. Es razonable suponer que el prefijo de dos letras FBSSceneSnapshotActiones una abreviatura de FrontBoard, que según Rene Ritchie en " Lista de deseos de iOS 9: Modo invitado" es parte de toda la familia de software relacionada con el lanzamiento de aplicaciones:

Con iOS 8, Apple refactorizó su administrador de sistema, SpringBoard, en varios componentes más pequeños y enfocados. Además de BackBoard, que ya se separó para manejar tareas en segundo plano, agregaron Frontboard para tareas en primer plano. También agregaron PreBoard para manejar la pantalla de bloqueo en condiciones seguras y cifradas. [...]

No tengo idea de para qué es el BSprefijo BSSettings, pero

BSes una abreviatura de BackBoard Settings, y un análisis de este mensaje de registro indicaría que no es nada de lo que hizo, y debe presentar un radar con los pasos para reproducir el mensaje de registro.

Si desea intentar obtener un seguimiento de la pila, puede implementar la categoría vinculada aquí . Algunos argumentarían que anular la API privada es una mala idea, pero en este caso una inyección temporal para obtener un seguimiento de la pila no puede ser demasiado dañina.

EDITAR:

Pero, todavía queremos saber qué es esta acción. Así que puse un punto de interrupción -[UIApplication _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion]y comencé a imprimir valores de registro y encontré una clase llamada FBSceneImplque tenía un montón de información sobre mi aplicación:

Escena

Podemos averiguar qué método privado se llama a continuación (almacenado en el contador de programa, puntero de instrucción, registro 15).

Contador de programa

Intenté encontrar la FBSceneSnapshotActionreferencia no manejada en el registro, pero no dados. Luego, subclasé UIApplication y anulé _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion. Ahora pude llegar a la acción directamente, pero aún así, no sabemos qué es.

Luego, volví a mirar FBSceneSnapshotAction. Resulta que tiene una superclase llamada BSAction.

Luego escribí una herramienta similar a RuntimeBrowser y busqué todas las subclases de BSAction. Resulta que hay una buena lista de ellos:

Lista de Acción

Los dos nombres de métodos que tenemos (uno del registro y otro del contador del programa en los dispositivos) indican que estas acciones se utilizan bajo el capó para pasar acciones por el sistema.

Algunas acciones probablemente se envían a las devoluciones de llamada del delegado de la aplicación, mientras que otras se manejan internamente.

Lo que está sucediendo aquí es que hay una acción que no se manejó correctamente y el sistema lo está notando. Al parecer, no se suponía que lo viéramos.

Moshe
fuente
Buena investigación, pero aquí hay algo interesante, obtengo el error OP exacto cuando uso la API privada de Apple. Supongo que, dado que estoy usando la API privada, obtengo el registro de la consola probablemente para los ingenieros de Apple.
OhadM
1
@Moshe ¿Cuánto te pagó Apple por investigar en su nombre? Pero puede que no les interese. : p
codelearner
¿Qué significa "presentar un radar al respecto"?
Paul Masri-Stone
Significa presentar un informe de error con la herramienta de informe de errores de Apple.
Moshe
12

AFAIK, la información anterior está relacionada con iOS durante la instantánea de la pantalla (supongo que para hacer doble clic en el comportamiento relacionado con la multitarea en el hogar). Investigué profundamente mi aplicación y parece que no obtiene ningún comportamiento secundario. Puede ignorarlo con seguridad, por ahora.

Puede usar la siguiente categoría simple de esencia para probarse contra las llamadas a la función anterior:

valvolina
fuente
1

Lo he descubierto, sucederá cuando tenga el método IBAction declarado en el archivo .ho .m pero no lo haya vinculado a ningún control.

.m ejemplo:

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

pero no asignó este método a ningún control en el guión gráfico.

Seema Sharma
fuente
Este no es el caso en mi aplicación: no tengo ninguna IBAction sin vincular y también recibo este mensaje. Sin embargo, mi aplicación es una aplicación Swift.
henrikstroem
1

No he descubierto por qué sucede en mi aplicación, pero al menos puede detectar la excepción, si desea evitar que esto aparezca en su panel de registro. No es una solución, pero podría darle más información sobre por qué está sucediendo al inspeccionar cualquiera de los argumentos que se pasan en la captura.

versión 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")
    }
}
Marc D.
fuente