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


84

Beim Ausführen meiner App unter iOS 9 bei Verwendung eines Storyboards ist der folgende Fehler in der Konsole aufgetreten. 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;
    };
}

Apple sagt, iOS 9 geht es um Stabilität, also sollten Sie sich keine Sorgen machen ;-) PS Ich habe das gleiche Problem und einige andere Entwickler auch stackoverflow.com/questions/32344082/…
Roma

11
Ich bin mir nicht sicher, ob es sich um Storyboards handelt. Ich sehe es auch in meiner Nicht-Storyboard-App.
Koen

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

Ich verwende keine Storyboards und erhalte auch diese Warnung. Es wird angezeigt, wenn Sie den Simulator mit CMD + L sperren und dann "zum Entsperren schieben", um wieder in die App zu gelangen.
SDW

Wenn Sie sich das Geräteprotokoll ansehen, hat dies möglicherweise etwas mit dem automatischen Ausschalten des Gerätebildschirms zu tun. Die Zeile SpringBoard[54] <Warning>: [MPUSystemMediaControls] Disabling lock screen media controls updates for screen turning off.wird direkt vor der angegebenen Fehlermeldung protokolliert.
Christian

Antworten:


32

An Ihrem Code ist nichts auszusetzen. 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:completionist eine Konvention, die angibt, dass die Methode privat / intern für die Klasse ist, in der sie deklariert ist. (Siehe diesen Kommentar .)

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

Mit iOS 8 hat Apple seinen Systemmanager SpringBoard in mehrere kleinere, fokussiertere Komponenten umgestaltet. Zusätzlich zu BackBoard, das bereits für Hintergrundaufgaben ausgegliedert 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 BSPräfix BSSettingsist, aber

BSist eine Abkürzung für BackBoard Settings, und eine Analyse dieser Protokollnachricht würde anzeigen, dass Sie nichts getan haben, und Sie sollten ein Radar mit Schritten zum Reproduzieren der Protokollierungsnachricht einreichen.

Wenn Sie versuchen möchten, eine Stapelverfolgung abzurufen, 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.

BEARBEITEN:

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. Ich fand eine Klasse namens, FBSceneImpldie eine ganze Reihe von Informationen über meine Anwendung enthielt:

Szene

Wir können herausfinden, welche private Methode als nächstes aufgerufen wird (gespeichert im Programmzähler, Befehlszeiger, Register 15.)

Programm zähler

Ich habe versucht, die nicht behandelten FBSceneSnapshotActionPunkte im Protokoll zu finden, aber keine Würfel. Dann habe ich UIApplication untergeordnet und überschrieben _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion. Jetzt konnte ich direkt an der Aktion teilnehmen, aber wir wissen immer noch nicht, was es ist.

Dann habe ich mir noch einmal die FBSceneSnapshotAction angesehen. Es stellt sich heraus, dass es eine Superklasse namens gibt BSAction.

Dann habe ich ein Tool geschrieben , das RuntimeBrowser ähnelt, und alle Unterklassen von BSAction nachgeschlagen. Es stellt sich heraus, dass es eine ganze Liste von ihnen gibt:

Aktionsliste

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 ausgeführt werden.

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


Gute Untersuchung, aber hier ist etwas Interessantes. Ich erhalte den genauen OP-Fehler, wenn ich die private Apple-API verwende. Ich denke, da ich die private API verwende, erhalte ich wahrscheinlich ein Konsolenprotokoll für Apple-Ingenieure.
OhadM

1
@ Moshe Wie viel hat Apple für die Ermittlungen in ihrem Namen bezahlt? Aber sie könnten nicht daran interessiert sein. : p
Codelearner

Was bedeutet "ein Radar darüber einreichen"?
Paul Masri-Stone

Es bedeutet, einen Fehlerbericht mit dem Fehlerberichter-Tool von Apple einzureichen.
Moshe

12

AFAIK, die obigen Informationen beziehen sich auf iOS während des Schnappschusses des Bildschirms (ich nehme an, für Doppelklick-Multitasking-Verhalten zu Hause). Ich habe meine Anwendung gründlich untersucht und es scheint, dass sie keine Nebenverhaltensweisen aufweist. Sie können es vorerst ignorieren.

Sie können die folgende einfache Kategorie verwenden , um sich gegen die Aufrufe der obigen Funktion zu testen:


1

Ich habe es herausgefunden, es wird passieren, wenn Sie die IBAction-Methode in der .h- oder .m-Datei deklariert haben, sie aber nicht an ein Steuerelement gebunden haben.

.m Beispiel:

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

Diese Methode wurde jedoch keinem Steuerelement im Storyboard zugewiesen.


Dies ist in meiner App nicht der Fall. Ich habe keine ungebundenen IBActions und erhalte auch diese Nachricht. Meine App ist allerdings eine Swift-App.
Henrikstroem

1

Ich habe 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 Protokollbereich auftaucht. Es ist keine Lösung, aber es könnte Ihnen mehr Einblick geben, warum es passiert, indem Sie eines der Argumente untersuchen, die im Fang ü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")
    }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.