在 iOS4.0 单击 iPhone 上的主页按钮退出应用程序之前,Apple 在他们的指南中表示不接受以编程方式退出应用程序。
现在 iOS4.0 中的一切都发生了变化,单击主页按钮会使您的应用程序处于暂停模式(多任务处理).. 我认为应该有一个明确的方式让用户退出应用程序,例如退出按钮。
苹果现在可以了吗?怎么办?
您可以设置 Info.plist 键 UIApplicationExitsOnSuspend 以确保应用程序完全终止。
不,仍然不应该这样做。
您有不同阶段的处理程序,因此您应该这样做。手动退出没有意义。如果您重新启动应用程序,理想情况下它会从您停止的地方开始,因此可以通过恢复或启动并加载旧状态。
没有理由退出。
编辑
随着这再次出现:iOS 人机界面指南说“不要以编程方式退出”。我们已经看到许多关于过去调用 exit() 的应用程序的报告。
当然,通过在 Info.plist 文件中设置适当的键来退出而不是挂起是非常好的——但这不是专用的 UI 按钮,只是通过主页按钮执行程序退出的特定于应用程序的实现。
以编程方式调用是有原因的exit()
。
假设您有一个 voip 应用程序,该应用程序始终在启动时启动,并在被系统杀死时重新启动,例如发生内存警告时。通常这是首选行为,因为您需要在后台运行以维护您的 voip TCP 套接字。
但是,如果应用程序支持多种操作模式——例如 a) 使用 TCP 在后台运行,b) 不在后台运行,而是仅在接受 PUSH 通知后启动——如果用户在 b) 模式下使用应用程序,他不会不认为该应用程序正在消耗可用于其他应用程序的内存。
因此,如果应用程序可以在启动时检查它是否已在后台启动并且用户希望应用程序以 b) 模式运行并且优雅地运行,exit(0)
这样它就不会再自动重新启动,那就太好了。
请注意,iOS 应用程序的生命周期在用户控制之下,这意味着 iOS 应用程序不应该只是退出。您的发布版本应该只在无论如何都会崩溃的情况下调用 abort,并且 abort 调用可以防止损坏用户数据或让您更轻松地诊断问题。
在确定过早退出原因的主题时,了解和分析 iPhone OS 应用程序崩溃报告(技术说明 TN2151)可能会很有趣。
抱歉有点跑题了,但这与早期退出和诊断有关。
杰夫
我对此有一个真正的问题。手动或实用退出有重要意义。
在以前的 iPhone OS 中,我的应用程序在终止时会在 plist 中写出它的状态(第一次使用或第二次等)。当用户回来时,它想通过阅读 plist 来展示不同的东西。此外,它希望每次用户退出后返回时都显示第一个屏幕。
随着应用程序在 iPhone OS4 的后台挂起,应用程序会从上次停止的地方返回(即无论用户在哪里都显示相同的屏幕)并且永远不会改变它的状态,因为现在永远不会调用 applicationWillTerminate。
因为这是大多数时候想要的行为(当您暂时退出应用程序时能够继续),必须有一种方法可以选择,即暂停或退出。
由于设置 UIApplicationExitsOnSuspend=YES 只提供了一种方法(即它总是在按下 HOME 时终止),这不是我正在寻找的解决方案。
我希望应用程序知道整个步骤链完成后,而不是仅仅暂停序列,并在正确的时间自行退出。
为此,我必须能够在使用完成整个序列后终止应用程序并写出状态。其他时候,我只想暂停应用程序。
如果您点击主页按钮两次,您可以看到暂停的应用程序。我可以通过触摸更长的时间并触摸出现的 (-) 符号来删除(退出)我的应用程序,但这对用户来说不是那么直观,而且步骤太多。
另一种选择是在我的应用程序中将退出按钮作为导航选项卡之一,但这很难看。目前,我唯一的选择似乎是选择设置 UIApplicationExitsOnSuspend=YES。
您可以随时使用exit(1)
. 这是一个原始/强制退出,带有一个整数作为代码/原因。您可以在开发过程中使用它,例如在您只想终止的模拟模式下;就像现在一样。
以下是@Joost Schuur 回答的步骤:
打开你的info.plist文件
添加关键UIApplicationExitsOnSuspend 或选择应用程序不在后台运行
将新键设置为YES 或填写复选框
断点applicationWillResignActive
并将applicationWillTerminate
显示它有效。
你不应该这样做。当用户想要退出你的应用程序时,他会按下 HOME 按钮。
当用户按下主页按钮时,您会收到UIApplicationWillResignActiveNotification
通知。使用该通知来拆除所有资源。
基本上,当用户按下主页按钮时,您的应用程序应该“隐藏在角落”(尽可能少地消耗内存)。但是,需要权衡取舍,因为您拆掉的次数越多,当用户切换回来时(需要重新加载所有资源)再次显示应用程序所需的时间就越长。
只需使用以下方法即可优雅退出动画
@IBAction func MinimizeOrKillApp(){
UIControl().sendAction(#selector(URLSessionTask.suspend), to: UIApplication.shared, for: nil)
//Comment if you want to minimise app
Timer.scheduledTimer(withTimeInterval: 0.2, repeats: false) { (timer) in
exit(0)
}
}
不建议这样做,您的应用将被拒绝。我们都是开发人员,我们知道如何从审核团队那里获得批准
你可以这样做:
@IBAction func yourButtonAcation(_ sender: Any) {
UIControl().sendAction(#selector(URLSessionTask.suspend), to: UIApplication.shared, for: nil)
}
您可以使用以下私有命令以编程方式将应用程序置于后台:
(但如果你使用它,你的应用会被拒绝)
[[UIApplication sharedApplication] suspend];