4

我正在尝试创建一个 iOS 崩溃报告工具。我想知道应用程序是否可以在终止后发送崩溃信息。

所以我的问题是: - 终止后iOS应用程序的生命周期是什么?- 我在哪里可以阅读更多关于 iOS 在终止时对应用程序所做的事情?

4

4 回答 4

7

在应用程序崩溃时执行任何非异步安全任务是非常推荐的!

  1. 您当时不允许分配任何新内存
  2. 您只能使用异步安全代码(任何 Objective-C 代码都不是异步安全的)
  3. 您需要考虑到内存已经损坏
  4. 您需要实现异步安全的网络代码
  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*/
    }

myExcHandler 是一个 C 回调,它接受一个NSException作为参数,当异常发生时它将被调用。

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

必须说有很多可用的崩溃报告库。不要重新发明轮子;-)

于 2013-10-21T12:03:51.740 回答
0

来自苹果文档

如果您的应用程序在终止时正在运行(在前台或后台),系统会调用您的应用程序委托的 applicationWillTerminate: 方法,以便您可以执行任何所需的清理。您可以使用此方法保存用户数据或应用程序状态信息,以便在后续启动时将应用程序恢复到当前状态。您的方法有大约 5 秒的时间来执行任何任务并返回。如果它没有及时返回,应用程序将被杀死并从内存中删除。

向下滚动到“应用程序终止”以阅读有关此的更多信息。

希望它有任何帮助

于 2013-10-21T11:49:24.890 回答
0

您获得的应用程序终止的最后一个事件是在applicationWillTerminate方法中。如果应用程序被挂起,则不会调用此方法。如果您的应用程序在此处终止后崩溃,您可以在您的应用程序机器上监控崩溃日志:

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

于 2013-10-21T11:52:35.813 回答