区分一个iPhone应用程序崩溃和被杀死

你好,我打算开发一个简单的iPhone游戏。 我希望能够区分真正的崩溃和用户杀死应用程序(通过双击主屏幕,并长期点击它杀死它)。

有人可以通过多任务栏消除应用程序时发生的情况。

如果你的应用程序在后台,并在用户杀死它的时候挂起,它将不会收到通知。 这占了大部分的情况。

如果您的应用程序当前正在后台运行 (只有特定类别的应用程序可以这样做),那么它会收到applicationWillTerminate

事实上,苹果很清楚,在进入后台之前应该保存任何相关数据。 看看这个 (“响应应用终止”一章):

即使您使用iOS SDK 4及更高版本开发您的应用程序,仍然必须准备好在没有任何通知的情况下处理您的应用程序。 用户可以使用多任务UI来显式地杀死应用程序。 另外,如果内存变得受限,系统可能会从内存中删除应用程序以腾出更多空间。 如果您的应用程序当前处于暂停状态,系统将会终止您的应用程序并将其从内存中删除,恕不另行通 但是,如果您的应用程序当前正在后台运行(换句话说,不挂起),则系统会调用您的应用程序委托的applicationWillTerminate:方法。 您的应用程序无法从此方法请求额外的后台执行时间。

编辑:

关于“说抱歉”的事情…

你肯定可以在下次发布时做到这一点。 只需将密钥存储在NSUserDefaults并在应用程序进入后台时将其删除(我希望所有这一切听起来很熟悉,否则请查看UIApplicationDelegate协议)。

当应用程序启动时,您检查密钥; 如果它在那里,那么应用程序并没有被用户closures; 如果应用程序不在那里,那么用户至less将应用程序移到背景,并没有经历任何突然终止…

对于iOS6和更高版本,有一种方法可以做到这一点。 状态恢复的一个副作用是当恢复期间崩溃或用户手动杀死应用程序时,它将删除状态。 你可以利用这个优势来检测用户手动查杀应用程序。

从文档 :

请注意,当用户强制退出应用程序时,系统会自动删除应用程序的保留状态。 当应用程序被终止时删除保存的状态信息是安全的预防措施。 (如果应用程序在启动时崩溃,系统也会删除保留的状态,这是类似的安全措施。)如果要testing应用程序恢复其状态的能力,则不应在debugging过程中使用多任务栏来终止应用程序。 相反,使用Xcode杀死应用程序或通过安装临时命令或手势来按需要调用退出来以编程方式closures应用程序。

以下代码假定您已经有一个名为_didCrashInLastSession崩溃检测BOOL 。 获取此值的方法有多种,如第三方库 。 在您的代码中调用方法[self getLaunchType]来查看您正在处理的启动types,并据此采取行动。 在你的AppDelegate.m中放入以下内容:

 typedef NS_ENUM(NSInteger, LaunchType) { LaunchTypeUnknown, LaunchTypeNewInstall, LaunchTypeNormalLaunch, LaunchTypeCrashedLastSession, LaunchTypeUserManualQuit, }; static BOOL hadStateToRestore = NO; static NSString * const kAppHasEverRunKey = @"appHasEverRun"; - (BOOL)application:(UIApplication *)application shouldSaveApplicationState:(NSCoder *)coder { // Called when going into the background [[NSUserDefaults standardUserDefaults] setBool:YES forKey:kAppHasEverRunKey]; [[NSUserDefaults standardUserDefaults] synchronize]; return YES; } - (BOOL)application:(UIApplication *)application shouldRestoreApplicationState:(NSCoder *)coder { // Called on start up hadStateToRestore = YES; return YES; } - (LaunchType)getLaunchType { if (_didCrashInLastSession) { return LaunchTypeCrashedLastSession; } if (![[NSUserDefaults standardUserDefaults] boolForKey:kAppHasEverRunKey]) { return LaunchTypeNewInstall; } if (!hadStateToRestore) { return LaunchTypeUserManualQuit; } return LaunchTypeNormalLaunch; } 

更新 :至less有一个第三方SDK打破了这个技术:城市飞艇。

你也可以通过你的设备来完成。 将您的设备连接到您的机器。 运行xcode并转到组织者。 在那里select您的设备和设备日志。 在那里你也可以看到你的应用程序或游戏的崩溃日志。