2013-10-21 44 views
4

我想创建一个iOS崩溃记者工具。我不知道应用程序是否可以在终止后发送崩溃信息。iOS应用程序:崩溃和终止后是否有生命?

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

+0

所以,我的问题是指在该生命周期后发生的事情。 – mafonya

+0

应用程序终止后,您无法执行任何操作。您只能在[applicationWillTerminate]中执行一些操作(https://developer.apple.com/library/ios/documentation/uikit/reference/UIApplicationDelegate_Protocol/Reference/Reference.html#//apple_ref/occ/intfm/UIApplicationDelegate/applicationWillTerminate :) 方法。 –

+0

也许你应该研究像“crashlytics”或“google analytics”这样的工具是如何工作的。我将使用后台服务发送详细的崩溃信息,并在applicationWillTerminate方法中向该后台服务发送简短报告。 –

回答

7

当应用程序崩溃时执行任何非异步安全任务不是-推荐!

  1. 你不准当时
  2. 你只能使用异步安全的代码分配的新内存(任何Objective-C代码为异步安全)
  3. 你需要采取考虑到内存已损坏
  4. 您需要实施异步安全网络代码
  5. 以及许多其他更多原因。

见从兰登富勒,PLCrashReporter的作者,这些博客文章:

  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

您正在试图解决一个问题,那就是没有问题现实世界。人们重新启动应用程序并发送崩溃报告。

0

Apple docs

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

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

希望这是任何帮助

+2

当用户杀死应用程序或者在低内存情况下从应用程序中获取应用程序时,情况并非如此。 – rckoenes

0

你有申请终止在applicationWillTerminate方法的最后一个事件。如果应用程序暂停,则不会调用此方法。您可以将您的应用程序的机器上监测崩溃日志如果您的应用程序终止后,在这里坠毁:

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

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 
} 

必须说,有大量的崩溃报告LIB提供。不要重新发明轮子;-)

+0

你说得对,我试图不发明另一个轮子。但所有这些现有的解决方案都无法立即发送报告,所以我正试图找到一种方法来实现。 – mafonya

+0

可能是因为这是不可能的。尝试使用过期处理程序,但我并不完全确定这是与杀死的应用程序一起处理,与NSURLSession相同。 – Andrea