4

iOS クラッシュ レポーター ツールを作成しようとしています。アプリケーションが終了した後にクラッシュ情報を送信できるかどうか疑問に思います。

私の質問は次のとおりです。 - 終了後の iOS アプリケーションのライフサイクルとは何ですか? - 終了時に iOS がアプリケーションに対して行うことについて、どこで詳しく読むことができますか?

4

4 に答える 4

7

アプリがクラッシュしたときに非同期セーフでないタスクを実行することは、強くお勧めできません!

  1. その時点で新しいメモリを割り当てることはできません
  2. 非同期セーフ コードのみを使用できます (Objective-C コードは非同期セーフではありません) 。
  3. メモリがすでに破損していることを考慮する必要があります
  4. async-safe ネットワーク コードを実装する必要がある
  5. 他にもたくさんの理由があります。

PLCrashReporter の作成者である Landon Fuller による次のブログ投稿を参照してください。

  1. http://landonf.bikemonkey.org/code/crashreporting/Reliable_Crash_Reporting_1.1.20130119.html
  2. http://landonf.bikemonkey.org/code/objc/Reliable_Crash_Reporting.20110912.html

あなたは問題を解決しようとしていますが、それは現実世界の問題ではありません。人々はアプリを再起動し、クラッシュ レポートを送信します。

于 2013-10-21T12:48:58.010 に答える
3

はい、一種の... iOSがクラッシュしているアプリを強制終了する前に例外を処理できますが、非同期操作を実行することはできません(おそらく、有効期限ハンドラーまたはiOS7 NSURLSessionでバックグラウンド操作を使用できるとは限りません)。ファイルをサーバーに送信するのと同じですが、次の再起動時に行うことができます。
その背後にあるアイデアは、 -applicationDidFinishLaunching で例外ハンドラーを設定することです。

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        NSSetUncaughtExceptionHandler(&myExcHandler);
        /* your code*/
    }

NSExceptionmyExcHandler は、例外が発生したときに呼び出されるパラメータとしてを受け入れる C コールバックです。

void myExcHandler(NSException *exception)
{
  //set something on NSUserDefault to check at next start
}

利用可能なクラッシュレポートライブラリがたくさんあると言わなければなりません。車輪を再発明しないでください;-)

于 2013-10-21T12:03:51.740 に答える
0

アプリケーション終了のために取得した最後のイベントは、applicationWillTerminateメソッドにあります。アプリケーションが中断されている場合、このメソッドは呼び出されません。ここで終了後にアプリケーションがクラッシュした場合は、アプリケーションのマシンでクラッシュ ログを監視できます。

~/Library/Logs/CrashReporter/MobileDevice/<your iPhone’s name>/

于 2013-10-21T11:52:35.813 に答える