iOS:是否有任何委托方法可以在应用程序因崩溃而退出时调用?

6
我希望在我的应用程序由于内存不足、内存泄漏等常见崩溃情况而崩溃时,能够与我的服务器进行一些交互。我想知道,在这种情况下是否会调用任何代理方法,以便在应用程序由于任何崩溃而退出之前,我可以快速且立即地与我的服务器联系。
谢谢。

1
我认为没有任何委托方法可以记录崩溃。这篇文章与你的有些相似。https://dev59.com/_2sy5IYBdhLWcg3w6iNZ - Deepesh Gairola
当内存不足时,会调用(void)didReceiveMemoryWarning方法。 - Sugan S
不要重复造轮子:如果你想记录崩溃信息/堆栈跟踪等,我强烈推荐使用Crashlytics - 它是免费的,并且不需要你做任何努力。你可以在这个优秀的答案中找到更多信息和其他解决方案。 - maroux
2个回答

8

如您所述,您需要通知服务器,在应用程序由于任何崩溃而退出之前可以立即联系您的服务器。

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

以下是如何进行设置:

Appdelegate类的applicationDidFixnishLaunchin方法中编写此行代码: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"];

  }

嗨,这是用于记录异常处理程序的,但我需要在应用程序崩溃之前(仅)将其发送到我的服务器。那么,在这种情况下,我应该在哪里添加代码以上传崩溃日志? - Stella
@user213199,你可以在该处理程序方法中创建服务器连接,或者保留一个布尔值,在下一次立即启动应用程序时使用。 - Kamar Shad
我并不是这个意思,也没有说要将任何崩溃日志上传到服务器。当发生任何崩溃时,请通过与服务器交互告诉我您想要的内容。 - Kamar Shad
我想上传任何类型的崩溃日志到我的服务器,以了解崩溃原因、信息等。因此,我正在寻找一个地方,在应用程序崩溃退出之前添加代码来上传这些日志。 - Stella
你可以在 uncaughtExceptionHandler 中从内部将 [exception description] 发送到服务器。 - Kamar Shad
显示剩余8条评论

3

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

首先定义异常方法:

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  ....
}

希望这能对您有所帮助。


但是没有办法区分简单的主页按钮按下和崩溃。 - Scott Berrevoets
嗨,这是用于记录异常处理程序的,但我需要在应用程序崩溃之前(仅)将其发送到我的服务器。那么,在这种情况下,我应该在哪里添加代码以上传崩溃日志? - Stella
您可以在此处理程序中调用您的 Web 服务。 - Nishant Tyagi
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; [prefs setObject:@"异常详情" forKey:@"LastException"]; 上述代码片段正常工作,但当我将其放置在未捕获异常处理程序中时,它不会保存给定的异常详情。 - Durai Amuthan.H
我自己找到了答案。将[[NSUserDefaults standardUserDefaults] synchronize];添加到现有的代码片段中解决了我的问题。 - Durai Amuthan.H
你把[[NSUserDefaults standardUserDefaults] synchronize]放在哪里?我把它放在uncaughtExceptionHandler里面,但是它没有保存nsuserdefaults中的值。请帮忙。 - CarlosAndres

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接