iOS:当应用程序因任何崩溃而退出时,是不是有任何委托方法

Posted

技术标签:

【中文标题】iOS:当应用程序因任何崩溃而退出时,是不是有任何委托方法【英文标题】:iOS: Is there any delegate method when the app quits due to any crashiOS:当应用程序因任何崩溃而退出时,是否有任何委托方法 【发布时间】:2013-04-26 04:11:44 【问题描述】:

当我的应用程序在崩溃时由于内存不足、内存泄漏等一般崩溃而退出时,我想与我的服务器进行一些交互。我想知道,在这种情况下是否会调用任何委托方法,以便我可以在应用程序因任何崩溃而退出之前立即快速联系我的服务器。

谢谢。

【问题讨论】:

我不认为有任何记录崩溃的委托方法。这篇文章和你的有些相似。 ***.com/questions/8233388/… - (void)didReceiveMemoryWarning 方法在内存不足时被调用 不要重新发明***:如果你想记录崩溃信息/堆栈跟踪等,我强烈推荐Crashlytics - 它是免费的,而且你需要零努力。您可以在此excellent answer 中找到更多信息和其他解决方案。 【参考方案1】:

正如您所解释的,您需要连接服务器,您可以在应用因任何崩溃而退出之前立即联系您的服务器。

在这种情况下,您应该设置exception handler,因为任何exception 都会发生,您会收到通知

看看你是怎么做到的

applicationDidFixnishLaunchinAppdelegate类的方法中写下NSSetUncaughtExceptionHandler (&uncaughtExceptionHandler)这行代码

 -(BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:  
  (NSDictionary*)launchOptions
    
    NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler); 

   EDIT:
   if( [[NSUserDefaults standardUserDefaults] boolForKey:@"isExceptionOccured"])
   
    //call sever code here
    [[NSUserDefaults standardUserDefaults] setBool:FALSE forKey:@"isExceptionOccured"];
   
   //rest of your code
 


 void uncaughtExceptionHandler(NSException *exception)
  


  NSLog(@"Exception Got %@",[exception description]);
  //do what ever you what here 
  //can save any `bool` so that as aaplication  run on immediate next launching of crash
  //could intimate any thing

  EDIT: 

  [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"isExceptionOccured"];

  

【讨论】:

嗨,这是用于记录异常处理程序,但我需要在崩溃(仅)退出我的应用程序之前发送到我的服务器。那么,在这种情况下,我可以在哪里添加代码来上传崩溃日志? @user213199 您可以在该处理程序方法中创建服务器连接,也可以保留布尔值并在下次立即启动应用程序时使用。 那么,你的意思是说我们可以使用这个地方将崩溃日志上传到我们的服务器,即使应用程序将要退出?但是按照 Apple 的规定,我们只能在 5 秒间隔内在 applicationWillTerminate 中做这些事情吗? 我不是这个意思,不是说将任何崩溃日志上传到服务器。在发生任何崩溃时通过与服务器交互来告诉我您想要什么。 我想将任何类型的崩溃日志上传到我的服务器,以了解崩溃的原因、信息等,因此寻找一个可以添加代码以在崩溃退出之前上传此类日志的地方应用程序。【参考方案2】:

添加您自己的异常处理程序,以捕获错误。

首先定义异常方法:

void uncaughtExceptionHandler(NSException *exception) 
    // You code here, you app will already be unload so you can only see what went wrong.

然后告诉应用使用你的异常处理程序:

- (void)applicationDidFinishLaunching:(UIApplication *)application  
    NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
    // The rest if you code  ....

希望对你有帮助。

【讨论】:

但是没有办法区分简单的主页按钮按下和崩溃 嗨,这是用于记录异常处理程序,但我需要在崩溃(仅)退出我的应用程序之前发送到我的服务器。那么,在这种情况下,我可以在哪里添加代码来上传崩溃日志? 您可以在此处理程序中调用您的 Web 服务。 NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; [prefs setObject:@"Exception details" forKey:@"LastException"];上面的代码 sn-p 可以正常工作,但是当我放在 uncaughtexceptionhandler 中时,它不会保存给定的异常详细信息。 我自己找到了答案。添加 [[NSUserDefaults standardUserDefaults]synchronize];使用现有代码 sn-p 解决了我的问题。

以上是关于iOS:当应用程序因任何崩溃而退出时,是不是有任何委托方法的主要内容,如果未能解决你的问题,请参考以下文章

xamarin ios 应用程序因 CBCentralManager 崩溃

Fabric 通知我 iOS 应用程序的“稳定性警报”,而应用程序运行良好且没有任何崩溃

iOS 7 应用程序冻结而没有崩溃

当我使用 Photos.app 时,我的 iOS 应用程序因内存压力而终止

iOS-应用程序退出时在 Crashlytics 上未收到崩溃

当 catch 实际上没有捕获任何东西时[重复]