检测我的应用程序的意外关闭

时间:2016-11-30 11:43:09

标签: ios objective-c swift

有时用户按下主页按钮并从最近列表中关闭应用程序。

我想用" - (void)applicationWillTerminate:(UIApplication *)application "等消息来警告用户。

如何检测这种意外关闭应用程序?有什么办法吗? 此外,我想保存用户填写的数据。

以下方法效果很好,但在后台暂停一段时间后,关闭应用程序将不会调用此方法。

{{1}}

swift 3.0中有解决方案吗?

8 个答案:

答案 0 :(得分:5)

要保存用户填写的数据,您应该使用func applicationDidEnterBackground(_ application: UIApplication)函数。

这是功能描述:

  

//使用此方法释放共享资源,保存用户数据,   使计时器无效,并将足够的应用程序状态信息存储到   将应用程序恢复到当前状态,以防它终止   后来。           //如果您的应用程序支持后台执行,则调用此方法而不是applicationWillTerminate:当用户时   退出。

至于"此应用程序上次没有正确关闭"您希望向用户显示的消息 - 显示此类消息是错误的。 关闭应用程序的方法是按主屏幕并从列表中关闭它,这是预期的行为。

答案 1 :(得分:0)

请检查此内容以了解iOS应用程序生命周期的工作原理 - https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html

现在,在您的项目中,找到以下方法来跟踪应用的生命周期过程。

对于Objective-C

- (void)applicationWillResignActive:(UIApplication *)application{
      // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
     // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}

- (void)applicationDidEnterBackground:(UIApplication *)application{
     // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}

- (void)applicationWillTerminate:(UIApplication *)application{
     // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    // Saves changes in the application's managed object context before the application terminates.
}

适用于Swift(3.0)

func applicationWillResignActive(_ application: UIApplication) {        
    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
    // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}

func applicationDidEnterBackground(_ application: UIApplication) {
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}

func applicationWillTerminate(_ application: UIApplication) {
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    // Saves changes in the application's managed object context before the application terminates.
}

希望这会有所帮助。

答案 2 :(得分:-1)

此方法可让您的应用知道它即将被终止并完全从内存中清除。您应该使用此方法为应用程序执行任何最终清理任务,例如释放共享资源,保存用户数据以及使计时器无效。您执行此方法大约需要五秒钟来执行任何任务并返回。如果方法在时间到期之前没有返回,系统可能会完全终止该进程。

-(void) applicationWillTerminate:(UIApplication *)application{    }

答案 3 :(得分:-1)

当用户将应用程序发送到后台时,您可以使用AppDelegate方法resignActive来保存数据。如果从didFinishLaunching方法启动并在方法didBecomeActive中检查此布尔值并保存数据,则在NSUserDefaults中保存一个布尔值true。使用数据和布尔值,您可以显示警报并重置这两个值。

答案 4 :(得分:-1)

如果用户在应用未被暂停时手动杀死应用,则会在您的应用代表中调用applicationWillTerminate

当用户只需按主页按钮时,您的应用代表就会调用applicationDidEnterBackground

如果applicationDidEnterBackground被调用,且applicationWillTerminate 可能,则该应用未被正确杀死。

我说可能是因为没有保证在app杀死的情况下调用applicationWillTerminate。事实上,如果应用程序被暂停,则不会调用该方法。

  

对于支持后台执行的应用程序,通常使用此方法   当用户退出应用程序时未调用,因为应用程序只是移动到   那种情况下的背景。但是,可以调用此方法   应用程序在后台运行的情况(未暂停)   并且系统需要因某种原因终止它。

来源:https://developer.apple.com/reference/uikit/uiapplicationdelegate/1623111-applicationwillterminate

手动终止不会导致调用此方法的情况是当用户按下主页按钮时,一段时间后他双击主页按钮并终止应用程序。在这种情况下,当用户按下主页按钮时,iOS会在您的代理中调用applicationDidEnterBackground,在约5秒后,应用程序将获得暂停状态。当用户稍后杀死应用程序时,其状态将被暂停,并且不会调用willTerminate方法。

如果暂停iOS杀死应用程序以获取资源,并将其终止状态,则会发生同样的情况。

我要做的是坚持applicationDidEnterBackground方法调用的timeStamp,在application​Will​Enter​ForegroundapplicationWillTerminate中取消。

如果下次你的application(_:​will​Finish​Launching​With​Options:​)被调用,你有applicationDidEnterBackground中保存的时间戳的值,这意味着用户没有手动杀死应用程序(可能)并且他没有来把它放在后台后回来。

如果用户在应用程序被暂停时杀死了应用程序,可能在您的情况下仍然会被视为滥用应用程序,并且可以显示该消息,以便涵盖所有用例。

答案 5 :(得分:-1)

你不应该这样做,但如果我们谈论理论,那么解决方案是显示警告总是,除了第一次运行。

我会在UserDefaults中保存一个布尔值,让我们称之为shouldShowWarning

其他一切都可以进去:

UIApplicationDelegate.application(_:​did​Finish​Launching​With​Options:​)

在方法中,您可以检查shouldShowWarning是否为true。如果是true,请显示警告。 然后将值设置为true

现在,如果应用程序终止并且您返回,则会显示警报。

如果您从代码中终止应用程序(非常非标准),请将shouldShowWarning设置为false以在重新启动应用程序时禁用警告。

答案 6 :(得分:-2)

您可以通过收听UIApplicationWillResignActiveNotification通知来执行此操作。

Detect when home button is pressed iOS

答案 7 :(得分:-3)

在Application Delegate中,您可以检查不同的事件。检查applicationWillResignActive方法或ApplicationDidEnterBackground。

适当的位置取决于您的用例。