web-dev-qa-db-fra.com

Erreur: _handleNonLaunchSpecificActions dans iOS9

Je reçois l'erreur suivante sur iOS 9:

    -[UIApplication_handleNonLaunchSpecificActions:
      forScene:
      withTransitionContext:
      completion:] unhandled action -> 
      <FBSSceneSnapshotAction: 0x150b2aef0> 
       {
            handler          = remote;
            info = <BSSettings: 0x15333f650> 
            {
                (1) = 5;
            };
        }

Quelqu'un d'autre a-t-il rencontré cette erreur ou ses implications? Qu'est-ce qui ne va pas?

157
Roddy

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

Il y a deux astuces qui indiquent qu'il s'agit de 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 de deux lettres dans FBSSceneSnapshotAction est un raccourci pour FrontBoard, qui selon Rene Ritchie dans " iOS 9 Wish-list: Mode Invité" fait partie de la famille entière. de logiciels liés au lancement d'applications:

Avec iOS 8, Apple a restructuré son gestionnaire système, SpringBoard, en plusieurs composants plus petits et plus ciblés. Outre BackBoard, qui était déjà conçu pour gérer les tâches en 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 du tout à quoi sert le préfixe BS dans BSSettings, mais une analyse de ce message de journalisation indiquerait que ce n'est pas du tout ce que vous avez fait, et vous devriez enregistrer un radar avec des étapes pour reproduire le message de connexion.

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 dommageable.

EDIT:

Mais nous voulons toujours savoir en quoi consiste cette action. Donc, je mets 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 de nombreuses 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, registre 15).

Program Counter

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

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

Ensuite, j'ai écrit n outil similaire à RuntimeBrowser et j'ai recherché toutes les sous-classes de BSAction. Il se trouve 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 transmettre des actions au 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 en prend note. Nous n'étions pas censés le voir, apparemment.

9
Moshe