web-dev-qa-db-fra.com

Storyboard iOS9 qu'est-ce qu'une action non gérée (handleNonLaunchSpecificActions)?

J'ai remarqué l'erreur suivante dans la console lors de l'exécution de mon application sur iOS 9 lors de l'utilisation d'un storyboard. J'utilise xCode7. Est-ce quelque chose dont je dois me préoccuper?

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

Il n'y a rien de mal avec votre code. Il s'agit d'un message de journalisation interne à Apple, et vous devez déposer un radar à ce sujet.

Il y a deux indices qui montrent que c'est probablement Code d'Apple:

  1. Le trait de soulignement précédant le nom de la méthode _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion est une convention indiquant que la méthode est privée/interne à la classe dans laquelle elle est déclarée. (Voir ce commentaire .)

  2. Il est raisonnable de deviner que le préfixe à deux lettres dans FBSSceneSnapshotAction est un raccourci pour FrontBoard, qui selon Rene Ritchie dans " iOS 9 wish-list: Guest Mode" fait partie de toute la famille de logiciels liés au lancement d'applications:

Avec iOS 8, Apple refactorisé son gestionnaire système, SpringBoard, en plusieurs composants plus petits et plus ciblés. En plus de BackBoard, qui était déjà essaimé pour gérer les tâches d'arrière-plan, ils ont ajouté Frontboard pour les tâches de premier plan Ils ont également ajouté PreBoard pour gérer l'écran de verrouillage dans des conditions sécurisées et cryptées. [...]

Je ne sais pas à quoi sert le préfixe BS dans BSSettings, mais

BS est un raccourci pour BackBoard Settings, et une analyse de ce message de journal indiquerait que ce n'est pas quelque chose que vous avez fait, et vous devez classer un radar avec des étapes pour reproduire le message de journalisation.

Si vous voulez essayer de récupérer une trace de pile, vous pouvez implémenter la catégorie liée à ici . Certains diront que remplacer l'API privée est une mauvaise idée, mais dans ce cas, une injection temporaire pour récupérer une trace de pile ne peut pas être trop nuisible.

MODIFIER:

Mais, nous voulons toujours savoir quelle est cette action. J'ai donc mis un point d'arrêt sur -[UIApplication _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion] et a commencé à imprimer les valeurs de registre et a trouvé une classe appelée FBSceneImpl qui contenait tout un tas d'informations sur mon application:

Scene

Nous sommes en mesure de savoir quelle méthode privée est appelée ensuite (stockée dans le compteur de programme, pointeur d'instruction, registre 15.)

Program Counter

J'ai essayé de trouver le FBSceneSnapshotAction non géré référencé dans le journal, mais pas de dés. Ensuite, j'ai sous-classé UIApplication et remplacé _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion. Maintenant, j'ai pu accéder directement à l'action, mais nous ne savons toujours pas ce que c'est.

Ensuite, j'ai regardé à nouveau FBSceneSnapshotAction. Il s'avère qu'il a une superclasse appelée BSAction.

Ensuite, j'ai écrit n outil similaire à RuntimeBrowser et j'ai recherché toutes les sous-classes de BSAction. Il s'avère qu'il y en a toute une liste:

Action List

Les deux noms de méthode que nous avons (un du journal et un du compteur de programme sur les périphériques) indiquent que ces actions sont utilisées sous le capot pour passer des actions autour du système.

Certaines actions sont probablement envoyées aux rappels du délégué de l'application, tandis que d'autres sont traitées en interne.

Ce qui se passe ici, c'est qu'il y a une action qui n'a pas été gérée correctement et que le système la note. Nous n'étions pas censés le voir, apparemment.

32
Moshe

AFAIK, les informations ci-dessus sont liées à iOS pendant l'instantané de l'écran (je suppose que pour un comportement lié à plusieurs tâches à la maison), j'ai étudié en profondeur mon application et semble ne pas avoir de comportements secondaires. Vous pouvez l'ignorer en toute sécurité, pour l'instant.

Vous pouvez utiliser ce qui suit Gist simple category pour vous tester par rapport aux appels à la fonction ci-dessus:

12
valvoline

je n'ai pas trouvé pourquoi cela se produit dans mon application, mais au moins vous pouvez intercepter l'exception, si vous voulez empêcher cela d'apparaître dans votre volet de journal. Ce n'est pas une solution, mais cela pourrait vous donner plus de détails sur la raison pour laquelle cela se produit en inspectant l'un des arguments qui sont passés dans la capture.

Version 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")
    }
}
1
Marc D.

Je l'ai compris, cela se produira lorsque vous aurez déclaré la méthode IBAction dans un fichier .h ou .m mais que vous ne l'avez liée à aucun contrôle.

Exemple .m:

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

mais pas attribué cette méthode à un contrôle dans le storyboard.

1
Seema Sharma