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


84

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 m'inquiéter?

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

Apple dit que iOS 9 est une question de stabilité, donc je suppose que vous ne devriez pas vous inquiéter ;-) PS J'ai le même problème, et quelques autres développeurs aussi stackoverflow.com/questions/32344082/…
Roma

11
Je ne sais pas si cela est lié aux Storyboards, je le vois aussi dans mon application non Storyboard.
koen le

Y a-t-il d'autres avertissements dans la construction? C'est peut-être un avertissement qui semble anodin?
Joe Susnick

Je n'utilise pas de storyboards et je reçois également cet avertissement. Il apparaît lorsque vous verrouillez le simulateur avec CMD + L, puis "faites glisser pour déverrouiller" pour revenir dans l'application.
SDW

En regardant le journal de l'appareil, cela pourrait avoir quelque chose à voir avec la désactivation automatique de l'écran de l'appareil. La ligne SpringBoard[54] <Warning>: [MPUSystemMediaControls] Disabling lock screen media controls updates for screen turning off.est enregistrée juste avant le message d'erreur cité.
Christian

Réponses:


32

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 qu'il s'agit probablement du code d'Apple:

  1. Le trait de soulignement précédant le nom de la méthode _handleNonLaunchSpecificActions:forScene:withTransitionContext:completionest 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 supposer que le préfixe à deux lettres FBSSceneSnapshotActionest 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 a remanié son gestionnaire de système, SpringBoard, en plusieurs composants plus petits et plus ciblés. En plus de BackBoard, qui était déjà conçu 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 n'ai aucune idée de ce à quoi sert le BSpréfixe BSSettings, mais

BSest un raccourci pour BackBoard Settings, et une analyse de ce message de journal indiquerait que ce n'est rien de ce que vous avez fait, et vous devez déposer 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.

ÉDITER:

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

Scène

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

Compteur de programme

J'ai essayé de trouver le non géré FBSceneSnapshotActionréférencé dans le journal, mais pas de dés. Ensuite, j'ai sous-classé UIApplication et j'ai 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 le FBSceneSnapshotAction. Il s'avère qu'il a une superclasse appelée BSAction.

Ensuite, j'ai écrit un 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:

Liste d'action

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

Certaines actions sont probablement envoyées aux rappels du délégué d'application, tandis que d'autres sont géré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 le système la note. Nous n'étions pas censés le voir, apparemment.


Belle enquête mais voici quelque chose d'intéressant, j'obtiens l'erreur OP exacte lorsque j'utilise l'API Apple privée. Je suppose que puisque j'utilise l'API privée, je reçois probablement le journal de la console pour les ingénieurs Apple.
OhadM

1
@Moshe Combien Apple vous a-t-il payé pour avoir enquêté en leur nom? Mais cela pourrait ne pas les intéresser. : p
codelearner

Que signifie «déposer un radar à ce sujet»?
Paul Masri-Stone

Cela signifie déposer un rapport de bogue avec l'outil de rapport de bogue d'Apple.
Moshe

12

AFAIK, les informations ci-dessus sont liées à iOS lors de la capture d'écran de l'écran (je suppose que pour le comportement lié au multitâche à la maison en double-clic) .J'ai étudié en profondeur mon application et il semble qu'elle n'obtienne aucun comportement secondaire. Vous pouvez l'ignorer en toute sécurité, pour l'instant.

Vous pouvez utiliser la catégorie simple suivante pour vous tester par rapport aux appels à la fonction ci-dessus:


1

Je l'ai compris, cela se produira lorsque vous aurez la méthode IBAction déclarée 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.


Ce n'est pas le cas dans mon application - je n'ai pas d'IBActions non liées et je reçois également ce message. Mon application est cependant une application Swift.
henrikstroem

1

Je n'ai pas trouvé pourquoi cela se produit dans mon application, mais au moins vous pouvez attraper l'exception, si vous voulez empêcher que cela n'apparaisse dans votre volet de journal. Ce n'est pas une solution, mais cela pourrait vous donner plus d'informations sur les raisons pour lesquelles cela se produit en inspectant l'un des arguments 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")
    }
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.