1

バックグラウンド

  • アプリでUKCrashReporterを使用しています。

  • 独自のUncaughtExceptionHandlerをインストールしました。

  • applicationDidFinishLaunching(1)でオブジェクトactiveItemControllerのmanagedObjectContextを設定しています

問題

managedObjectContextメソッドが例外をスローした場合、クラッシュレポーターダイアログボックスはアプリがクラッシュする前にのみ点滅するため、ユーザーがクラッシュを報告することはありません。

ウィンドウが表示されている間ではなく、クラッシュが報告されたにのみアプリを続行したい。

私が試したこと

  • UKCrashReporterCheckForCrash()がObjective Cメソッドである場合、performSelectorOnMainThread:waitUntilDone:YESを呼び出すことができると思いますが、そうではありません。

  • 条件付きロックを使用してアプリを一時停止することに関する他のスタックオーバーフローの質問をいくつか見てきましたが、C関数にどのように使用するか理解できません。

どうすればこれをうまくやることができますか?何かアドバイスはありますか?どんな回答でも大歓迎です。

コード

// In app delegate

-(void)applicationWillFinishLaunching:(NSNotification *)aNotification {
        UKCrashReporterCheckForCrash();   // A C function which then creates a window if
                                          // it detects a crash has happened.
}

-(void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    [activeItemController setMoContextDisk:[self managedObjectContext]];
    [activeItemController setMoContextMemory:[self managedObjectContextMemory]];
}

アップデート1

私がやろうとしていることの詳細を尋ねられたので、ここに行きます。

この考えを引き起こしたバグは、managedObjectModelsをマージするときの例外でした。私のアプリは、数ミリ秒ごとにコンソールに「Uncaughtexception」を出力するループに巻き込まれました。

そして、この例外が発生する前にキャッチされなかった例外ハンドラーをインストールすると、説明されている動作が得られます。アプリが起動し、クラッシュレポートダイアログが短時間表示された後、読み込みを続けて再度クラッシュします。

まとめ-起動時に発生するエラーを処理できるようにしたい。

(1)バインディングはクラスのテストをより問題にするだろうと思ったので、これを行うためにバインディングを使用していません。

4

1 に答える 1

1

あなたの問題は、アプリを「一時停止」していると考えることだと思います。それを別の初期UI状態と考えてください。実行ループをブロックしようとすると、インタラクティブウィンドウがインタラクティブになるのを防ぐことができます。:-)

最善の策は、「ユーザーにクラッシュレポートの送信を促す」方法で「いいえ、続行して通常どおりに開始する」と表示された場合にのみ、メインUIを表示する(およびデータソースを接続するなど)ことです。それ以外の場合は、ウィンドウを表示し、ユーザーがレポートを送信または送信を拒否したときにウィンドウを閉じて、アプリコントローラーに通常の起動を続行するように依頼します。

UKCrashReporterCheckForCrash()を調べましたが、どのような種類のウィンドウも作成されていないようです。クラッシュを送信するだけです。あなたがしていることをより詳細に説明していただけますか?

于 2009-12-02T16:22:40.713 に答える