wake-up-neo.com

iOS9 Storyboard Was ist eine nicht behandelte Aktion (handleNonLaunchSpecificActions)?

Ich habe den folgenden Fehler in der Konsole festgestellt, wenn meine App unter iOS 9 ausgeführt wird, wenn ein Storyboard verwendet wird. Ich benutze xCode7. Muss ich mir darüber Sorgen machen?

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

Es ist nichts falsch mit Ihrem Code. Dies ist eine Apple-interne Protokollierungsnachricht, und Sie sollten ein Radar darüber einreichen.

Es gibt zwei Hinweise, die zeigen, dass dies wahrscheinlich Apples Code ist:

  1. Der Unterstrich vor dem Methodennamen _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion Ist eine Konvention, die angibt, dass die Methode für die Klasse, in der sie deklariert ist, privat/intern ist. (Siehe dieser Kommentar .)

  2. Es ist zu vermuten, dass das Zwei-Buchstaben-Präfix in FBSSceneSnapshotAction eine Abkürzung für FrontBoard ist, das laut Rene Ritchie in " Wunschliste für iOS 9: Gastmodus" Teil der gesamten Familie ist von Software zum Starten von Apps:

Unter iOS 8 hat Apple) seinen Systemmanager SpringBoard in mehrere kleinere, stärker fokussierte Komponenten überarbeitet. Zusätzlich zu BackBoard, das bereits für Hintergrundaufgaben ausgelagert wurde, wurde Frontboard für Vordergrundaufgaben hinzugefügt Sie haben auch PreBoard hinzugefügt, um den Sperrbildschirm unter sicheren, verschlüsselten Bedingungen zu verwalten. [...]

Ich habe keine Ahnung, wofür das BS -Präfix in BSSettings ist, aber

BS ist die Abkürzung für BackBoard Settings, und eine Analyse dieser Protokollmeldung würde anzeigen, dass Sie nichts getan haben. Sie sollten ein Radar mit Schritten zur Reproduktion der Protokollmeldung einreichen.

Wenn Sie versuchen möchten, einen Stack-Trace zu erstellen, können Sie die hier verknüpfte Kategorie implementieren. Einige würden argumentieren, dass das Überschreiben der privaten API eine schlechte Idee ist, aber in diesem Fall kann eine temporäre Injektion zum Abrufen eines Stack-Trace nicht zu schädlich sein.

EDIT:

Aber wir wollen immer noch wissen, was diese Aktion ist. Also setzte ich einen Haltepunkt auf -[UIApplication _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion] Und begann, Registerwerte auszudrucken und fand eine Klasse namens FBSceneImpl, die eine ganze Reihe von Informationen über meine Anwendung enthielt:

Scene

Wir können herausfinden, welche private Methode als nächstes aufgerufen wird (gespeichert in der programm zähler, Befehlszeiger, Register 15.)

Program Counter

Ich habe versucht, das unbehandelte FBSceneSnapshotAction zu finden, auf das im Protokoll verwiesen wird, aber keine Würfel. Dann habe ich UIApplication untergeordnet und _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion Überschrieben. Jetzt war ich in der Lage, direkt an der Aktion teilzunehmen, aber wir wissen immer noch nicht, was es ist.

Dann schaute ich mir die FBSceneSnapshotAction noch einmal an. Es hat sich herausgestellt, dass es eine Superklasse namens BSAction hat.

Dann schrieb ich ein Tool ähnlich RuntimeBrowser und schlug alle Unterklassen von BSAction nach. Es stellt sich heraus, dass es eine ganze Liste von ihnen gibt:

Action List

Die beiden Methodennamen (einer aus dem Protokoll und einer aus dem Programmzähler auf den Geräten) zeigen an, dass diese Aktionen unter der Haube zum Weiterleiten von Aktionen im System verwendet werden.

Einige Aktionen werden wahrscheinlich an die Rückrufe des App-Delegaten gesendet, während andere intern verarbeitet werden.

Was hier passiert, ist, dass es eine Aktion gibt, die nicht richtig gehandhabt wurde und das System dies bemerkt. Wir sollten es anscheinend nicht sehen.

32
Moshe

AFAIK, die obigen Informationen beziehen sich auf iOS während des Schnappschusses des Bildschirms (ich nehme an, dass es sich um ein Doppelklick-Multitask-Verhalten handelt). Ich habe meine Anwendung eingehend untersucht und es scheint, dass es keine Nebeneffekte gibt. Sie können es vorerst ignorieren.

Sie können die folgende Gist simple category verwenden, um sich gegen die Aufrufe der obigen Funktion zu testen:

12
valvoline

ich habe nicht herausgefunden, warum es in meiner App passiert, aber zumindest können Sie die Ausnahme abfangen, wenn Sie verhindern möchten, dass diese in Ihrem Protokollfenster auftaucht. Es ist keine Lösung, aber es gibt Ihnen möglicherweise einen besseren Einblick, warum es passiert, wenn Sie eines der Argumente untersuchen, die im catch übergeben werden.

Swift 2 Version:

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.

Ich habe herausgefunden, dass es passieren wird, wenn Sie eine IBAction-Methode in einer .h- oder .m-Datei deklariert haben, diese aber nicht an ein Steuerelement gebunden haben.

.m Beispiel:

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

diese Methode wurde jedoch keinem Steuerelement im Storyboard zugewiesen.

1
Seema Sharma