【问题标题】:iOS app: Is there a life after crash and termination? [duplicate]iOS 应用程序:崩溃和终止后还有生命吗? [复制]
【发布时间】:2013-10-21 11:44:27
【问题描述】:

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

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

【问题讨论】:

  • 所以,我的问题是指在该生命周期之后会发生什么。
  • 应用程序终止后,您无法执行任何操作。你只能在applicationWillTerminate 方法中做一些事情。
  • 也许您应该调查“crashlytics”或“google analytics”等工具的工作原理。我会使用后台服务来发送详细的崩溃信息,并在 applicationWillTerminate 方法中向该后台服务发送简短报告。
  • 谢谢,尤努斯。很遗憾,您无法在 iOS 上运行后台服务。
  • 这不是一个真正的答案,但也许看看testflight如何实现他们的SDK中报告的崩溃testflightapp.com/sdk/download他们根据应用程序是否具有以下信号状态SIGILL调用异常, SIGABRTSIGBUS 也许你可以更简单一些。

标签: iphone ios objective-c ipad


【解决方案1】:

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

  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

您正在尝试解决一个问题,这在现实世界中不是问题。人们确实会重新启动他们的应用程序并将发送崩溃报告。

【讨论】:

    【解决方案2】:

    是的,有点……你可以在 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
    }
    

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

    【讨论】:

    • 你说得对,我试图不发明另一个轮子。但是所有这些现有的解决方案都无法立即发送报告,因此我正在尝试找到一种方法。
    • 可能是因为不可能。尝试使用过期处理程序,但我不完全确定是否在应用程序被终止时处理,对于 NSURLSession 也是如此。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      来自Apple docs

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

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

      希望对你有帮助

      【讨论】:

      • 当用户杀死应用程序,或者应用程序在内存不足的情况下从内存中被清除时,这不是真的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-25
      • 2018-04-12
      • 1970-01-01
      相关资源
      最近更新 更多