84

Ich habe festgestellt, dass der folgende Fehler in der Konsole auftaucht, wenn ich meine App unter iOS 9 verwende, wenn ich ein Storyboard verwende. Ich benutze xCode7. Ist das etwas, worüber ich besorgt sein muss?iOS9-Storyboard Was ist eine nicht behandelte Aktion (handleNonLaunchSpecificActions)?

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

Apple sagt, iOS 9 dreht sich um Stabilität, also sollten Sie sich keine Sorgen machen ;-) P.S. Ich habe das gleiche Problem, und einige andere Entwickler zu http://stackoverflow.com/questions/32344082/handlenonlaunchspecificactions-error-in-ios9 – Roma

+11

Nicht sicher, ob es mit Storyboards verwandt ist, sehe ich es auch in meiner nicht Storyboard App . – Koen

+0

Gibt es weitere Warnungen im Build? Vielleicht ist es eine Warnung, die trivial erscheint? –

Antwort

32

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

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

  1. Der Unterstrich führt den Namen der Methode _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion ist eine Konvention, die anzeigt, dass das Verfahren zur Klasse private/intern ist, dass es erklärt hat in. (this comment See.)

  2. Es ist vernünftig, dass die beiden Buchstabenpräfix für Frontboard in FBSSceneSnapshotAction ist eine Abkürzung zu erraten, die in "iOS 9 wish-list: Guest Mode" Rene Ritchie nach ist ein Teil des wh ole Familie von Software zu starten Apps bezogen werden:

Mit iOS 8, Refactoring Apple seine Systemmanager, Springboard, in mehrere kleinere, stärker fokussierte Komponenten. Zusätzlich zu BackBoard, das bereits für Hintergrundaufgaben ausgegliedert wurde, wurde Frontboard für Vordergrundaufgaben hinzugefügt. Sie haben außerdem PreBoard hinzugefügt, um den Sperrbildschirm unter sicheren, verschlüsselten Bedingungen zu verwalten. [...]

Ich habe keine Ahnung, was der BS Präfix in BSSettings für, aber

BS ist eine Abkürzung für BackBoard Settings und eine Analyse dieser Log-Nachricht würde bedeuten, dass es nichts ist Sie haben, und Sie sollten ein Radar mit Schritten einreichen, um die Protokollierungsnachricht zu reproduzieren.

Wenn Sie versuchen möchten, einen Stack-Trace zu erfassen, können Sie the category linked to here implementieren. Einige würden argumentieren, dass das Überschreiben von privaten API eine schlechte Idee ist, aber in diesem Fall kann eine temporäre Injektion, um einen Stack-Trace zu greifen, nicht zu schädlich sein.

EDIT:

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

Scene

Wir können, um herauszufinden, welche private Methode aufgerufen wird next (gespeichert in dem Programmzähler , Befehlszeiger, Register 15.)

Program Counter

ich versuchte, die un-behandelt FBSceneSnapshotAction referen Auffinden im Baumstamm, aber keine Würfel. Dann unterordnete ich UIApplication und überging _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion. Jetzt war ich in der Lage, direkt auf die Aktion zu kommen, aber wir wissen nicht, was es ist.

Dann schaute ich wieder auf die FBSceneSnapshotAction. Stellt sich heraus, es hat eine Oberklasse namens BSAction.

Dann schrieb ich a tool ähnlich wie RuntimeBrowser und blickte auf alle Unterklassen von BSAction. Es stellt sich heraus, dass es eine ganze Liste von ihnen:

Action List

die beiden Namen Methode, die wir (eine aus dem Protokoll und einer aus dem Programmzähler auf den Geräten) haben zeigt, dass diese Aktionen unter der Haube verwendet werden um Aktionen um das System herum durchzuführen.

Einige Aktionen werden wahrscheinlich an die Callbacks der App-Delegierten gesendet, während andere intern verarbeitet werden.

Was hier passiert ist, dass es eine Aktion gibt, die nicht korrekt behandelt wurde und das System merkt es. Wir sollten es anscheinend nicht sehen.

+0

Nette Untersuchung, aber hier ist etwas Interessantes, ich bekomme den genauen OP-Fehler, wenn ich private Apple API benutze. Ich nehme an, da ich die private API benutze, bekomme ich wahrscheinlich ein Konsolenprotokoll für Apple Ingenieure. – OhadM

+0

Fantastische Ermittlungsarbeit @Moshe –

+1

@Moshe Wie viel hat Apple Ihnen für die Untersuchung in ihrem Namen bezahlt? Aber sie sind vielleicht nicht daran interessiert. : p – codelearner

12

AFAIK, die Informationen über iOS während Snapshot verwandt ist der Bildschirm (ich nehme an für Doppelklick Hause Multitasking-Verhalten) .Ich sucht tief meine Anwendung und scheint, dass es keine Neben Verhalten bekommt. Sie können es jetzt sicher ignorieren.

Sie können folgende gist simple category verwenden, um sich gegen die Anrufe an die obige Funktion zu testen:

1

ich es herausgefunden haben, wird es geschehen, wenn Sie IBAction Methode in .h oder .m-Datei deklariert haben, aber Sie haben binden Sie es nicht an irgendeine Kontrolle.

.m Beispiel:

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

aber diese Methode nicht zu einer Steuerung in der Storyboard zugeordnet.

+0

Dies ist nicht der Fall in meiner App - Ich habe keine ungebundenen IBActions, und ich bekomme diese Nachricht auch. Meine App ist jedoch eine Swift-App. – henrikstroem

1

habe ich nicht herausgefunden, warum es in meiner App passiert, aber zumindest können Sie die Ausnahme abfangen, wenn Sie verhindern möchten, dass dies in Ihrem Protokollfenster auftaucht. Es ist keine Lösung, aber es könnte Ihnen mehr Einsicht geben, warum es so ist, indem 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") 
    } 
}