error handling - Storyboard iOS9 ¿Qué es una acción no controlada(handleNonLaunchSpecificActions)?
error-handling uistoryboard (4)
He notado el siguiente error que aparece en la consola cuando ejecuto mi aplicación en iOS 9 cuando uso un guión gráfico. Estoy usando xCode7. ¿Es esto algo de lo que necesito preocuparme?
-[UIApplication _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion:] ** unhandled action -> <FBSSceneSnapshotAction: 0x176bfb20> {
handler = remote;
info = <BSSettings: 0x176a5d90> {
(1) = 5;
};
}
AFAIK, la información anterior está relacionada con iOS durante la captura de pantalla 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 tiene ningún comportamiento secundario. Puedes ignorarlo con seguridad, por ahora.
Puede usar la siguiente categoría simple para probarse a sí mismo contra las llamadas a la función anterior:
Lo he descubierto, sucederá cuando tenga el método IBAction declarado en el archivo .h o .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 storyboard.
No hay nada malo con tu código. Este es un mensaje de registro interno de Apple, y debe archivar un radar al respecto.
Hay dos pistas que muestran que este es probablemente el código de Apple:
-
El guión bajo que lleva el nombre del método
_handleNonLaunchSpecificActions:forScene:withTransitionContext:completion
es una convención que indica que el método es privado / interno para la clase en la que se declara. (Vea este comentario ). -
Es razonable adivinar que el prefijo de dos letras en
FBSSceneSnapshotAction
es la abreviatura de FrontBoard, que según Rene Ritchie en " iOS 9 wish-list: Guest Mode" es parte de toda la familia de software relacionado con el lanzamiento de aplicaciones:
Con iOS 8, Apple refactorizó su administrador de sistema, SpringBoard, en varios componentes más pequeños y más enfocados. Además de BackBoard, que ya estaba listo 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 encriptadas. [...]
No tengo idea de para qué
BSSettings
prefijo
BS
en
BSSettings
, pero
BS
es la abreviatura de
BackBoard Settings
de
BackBoard Settings
, y un análisis de este mensaje de registro indicaría que no es algo que hiciste, y debes archivar un radar con pasos para reproducir el mensaje de registro.
Si desea probar y obtener un seguimiento de 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 perjudicial.
EDITAR:
Pero, todavía queremos saber qué es esta acción.
Así que puse un punto de interrupción en
-[UIApplication _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion]
y comencé a imprimir valores de registro y encontré una clase llamada
FBSceneImpl
que tenía
FBSceneImpl
información sobre mi aplicación:
Podemos averiguar qué método privado se llama a continuación (almacenado en el
contador
del
programa, el
puntero de instrucción, el registro 15).
Traté de encontrar la
FBSceneSnapshotAction
manejada a la que se
FBSceneSnapshotAction
referencia en el registro, pero sin dados.
Luego, subclasifiqué UIApplication y
_handleNonLaunchSpecificActions:forScene:withTransitionContext:completion
.
Ahora pude llegar a la acción directamente, pero aún así, no sabemos qué es.
Luego, volví a mirar la 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 gran lista de ellos:
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 debajo del 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 sucede aquí es que hay una acción que no se manejó correctamente y el sistema lo está notando. No se suponía que lo viéramos, al parecer.
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é sucede 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")
}
}