web-dev-qa-db-ja.com

iOS9ストーリーボード未処理のアクション(handleNonLaunchSpecificActions)とは何ですか?

ストーリーボードを使用しているときにiOS 9でアプリを実行すると、コンソールに次のエラーが表示されることに気付きました。私はxCode7を使用しています。これは私が心配する必要があるものですか?

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

コードに問題はありません。これはApple内部のログメッセージであり、レーダーについて報告する必要があります。

これがおそらくAppleのコードであることを示す2つのヒントがあります。

  1. メソッド名の先頭にあるアンダースコア_handleNonLaunchSpecificActions:forScene:withTransitionContext:completionは、メソッドが宣言されているクラスのプライベート/内部であることを示す規則です( this comment を参照)。

  2. FBSSceneSnapshotActionの2文字の接頭辞はFrontBoardの省略形であると推測するのは合理的です。これは、「 iOS 9ウィッシュリスト:ゲストモード」 のRene Ritchieによれば、家族全員の一部ですアプリの起動に関連するソフトウェアの一覧:

IOS 8では、Appleシステムマネージャー、SpringBoardをいくつかのより小さく、より焦点の合ったコンポーネントにリファクタリングしました。バックグラウンドタスクを処理するために既にスピンオフされたBackBoardに加え、 。彼らはまた、PreBoardを追加して、安全で暗号化された状態でロック画面を処理しました[...]

BSBSSettingsプレフィックスが何のためかわからないが、

BSBackBoard Settingsの省略形であり、このログメッセージの分析は、それがあなたがしたことではないことを示しています。

スタックトレースを取得したい場合は、 ここにリンクされているカテゴリ を実装できます。プライベートAPIをオーバーライドすることは悪い考えであると主張する人もいますが、この場合、スタックトレースを取得するための一時的な注入はあまり有害ではありません。

編集:

しかし、私たちはまだこのアクションが何であるかを知りたいです。そこで、-[UIApplication _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion]にブレークポイントを設定し、レジスタ値の出力を開始し、アプリケーションに関する情報がたくさんあるFBSceneImplというクラスを見つけました。

Scene

次に呼び出されるプライベートメソッドを見つけることができます( プログラムカウンター、 命令ポインタ、レジスタ15.)

Program Counter

ログで参照されている未処理のFBSceneSnapshotActionを見つけようとしましたが、サイコロは見つかりませんでした。次に、UIApplicationをサブクラス化し、_handleNonLaunchSpecificActions:forScene:withTransitionContext:completionをオーバーライドしました。今、私は直接アクションに到達することができましたが、それでも、それが何であるかはわかりません。

次に、FBSceneSnapshotActionをもう一度見ました。 BSActionというスーパークラスがあります。

それから ツールRuntimeBrowser に似たものを書き、BSActionのすべてのサブクラスを調べました。それらのかなりのリストがあることがわかります:

Action List

持っている2つのメソッド名(1つはログから、もう1つはデバイスのプログラムカウンターから)は、これらのアクションがシステム内でアクションを渡すために内部で使用されることを示しています。

一部のアクションはおそらくアプリデリゲートのコールバックまで送信され、他のアクションは内部的に処理されます。

ここで起こっているのは、正しく処理されなかったアクションがあり、システムがそれを記録しているということです。どうやらそれを見るはずがなかったようです。

32
Moshe

私の知る限り、上記の情報は、画面のスナップショット中のiOSに関連しています(ダブルクリックホームマルチタスク関連の動作を想定しています)。今のところ、無視しても問題ありません。

次の Gist simple category を使用して、上記の関数の呼び出しに対して自分自身をテストできます。

12
valvoline

私のアプリでなぜそれが起こるのか分かりませんが、少なくともあなたがこれをログペインにポップアップさせないようにしたければ、あなたは例外をキャッチすることができます。これは解決策ではありませんが、catchに渡された引数のいずれかを調べることで、なぜハッピングされているのかをより深く理解できる可能性があります。

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")
    }
}
1
Marc D.

私はそれを理解しました。hまたは.mファイルでIBActionメソッドを宣言しているが、コントロールにバインドしていない場合に発生します。

.mの例:

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

ただし、このメソッドをストーリーボードのコントロールに割り当てていません。

1
Seema Sharma