退出iPhone应用程序的正确方法?
-
21-08-2019 - |
题
我正在编写一个 iPhone 应用程序,由于某些用户操作,我需要强制它退出。清理应用程序分配的内存后,调用什么适当的方法来终止应用程序?
解决方案
你有没有尝试过 exit(0)
?
或者, [[NSThread mainThread] exit]
, ,虽然我没有尝试过,但这似乎是更合适的解决方案。
其他提示
在iPhone上没有退出一个应用程序的概念。应该引起应用程序退出的唯一动作是触摸手机上的Home键,而这不是开发人员可以访问。
据苹果公司称,您的应用程序不应该自行终止。由于用户没有击中主页按钮,任何返回到主屏幕给用户的印象是你的应用程序崩溃。这是令人困惑的,非标准的行为,应该避免使用。
出口(0)出现于用户作为崩溃,所以显示一个确认消息给用户。确认之后暂停(编程主页按钮按压)并等待2秒,而应用即将背景与动画那么后面用户的视图出口
-(IBAction)doExit
{
//show confirmation message to user
UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Confirmation"
message:@"Do you want to exit?"
delegate:self
cancelButtonTitle:@"Cancel"
otherButtonTitles:@"OK", nil];
[alert show];
}
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex != 0) // 0 == the cancel button
{
//home button press programmatically
UIApplication *app = [UIApplication sharedApplication];
[app performSelector:@selector(suspend)];
//wait 2 seconds while app is going background
[NSThread sleepForTimeInterval:2.0];
//exit app when app is in background
exit(0);
}
}
它不是一个真正的方式退出该程序,而是一个方式,迫使人们戒烟。
UIAlertView *anAlert = [[UIAlertView alloc] initWithTitle:@"Hit Home Button to Exit" message:@"Tell em why they're quiting" delegate:self cancelButtonTitle:nil otherButtonTitles:nil];
[anAlert show];
检查Q&A这里: https://developer.apple.com /library/content/qa/qa1561/_index.html
问:我如何编程放弃我的iPhone应用程序
有没有设置用于正常终止iOS应用程序的API。
在iOS的,用户按压主按钮关闭应用程序。如果您的应用程序有它不能提供其预期功能的条件下,推荐的方法是为用户显示指示问题,用户可以采取可能的行动的性质警报 - 打开无线网络连接,实现位置服务的,等等。允许用户自己的判断终止应用程序。
警告:强>不要调用
exit
功能。应用程序调用exit
将出现在用户已经崩溃,而不是执行正常终止和动画返回到主屏幕。此外,数据可能不会被保存,因为
-applicationWillTerminate:
和类似UIApplicationDelegate
方法将不被如果调用退出调用。如果在开发过程中或测试,必须终止应用程序时,
abort
功能,或assert
宏建议
转到您的info.plist,并检查关键“应用程序在后台不运行”。此,当用户点击主页按钮时,应用程序退出完全。
添加上UIApplicationExitsOnSuspend
到application-info.plist
true
属性。
经过一些测试,我可以说以下几点:
- 使用私有接口:
[UIApplication sharedApplication]
会导致应用程序看起来崩溃了,但它会调用- (void)applicationWillTerminate:(UIApplication *)application
在此之前; - 使用
exit(0);
也会终止应用程序,但它看起来“正常”(跳板的图标显示如预期,具有缩小效果),但它不会调用- (void)applicationWillTerminate:(UIApplication *)application
委托方法。
我的建议:
- 手动调用
- (void)applicationWillTerminate:(UIApplication *)application
关于代表。 - 称呼
exit(0);
.
您ApplicationDelegate得到由用户所通知故意戒烟的:
- (void)applicationWillResignActive:(UIApplication *)application {
当我得到这个通知,我只是叫
exit(0);
这做所有的工作。最重要的事是,它是useres意图退出,这就是为什么这不应该是一个问题调用它。
在我的音乐,应用程序,有必要退出后,人们同步自己的设备,而音乐还在玩的应用程序。一旦同步完成,我收到了通知。但经过正确的退出应用程序实际上看起来像一个崩溃。
所以不是本人设置一个标志,彻底离开上的下一个动作backgrounding该应用。它是没问题要同步之后刷新应用程序。
我的应用最近已BC我使用一个未记录的方法拒绝。字面上:
“不幸的是,不能因为它是使用私有API添加到App Store使用非公开的API,如iPhone开发人员计划许可协议第3.3.1节所列禁止的:
“3.3.1应用可以仅在由Apple规定的方式使用记录的API和不得使用或调用任何私人的API。”
这被包括在应用程序中所述的非公共API是terminateWithSuccess“
苹果说:
“警告:不要调用exit函数的应用程序调用exit将出现在用户已经崩溃,而不是执行正常终止和动画返回到主屏幕”
我认为这是一个坏的假设。如果用户点击一个退出按钮,就会出现一条消息,这样说:“应用程序现在将退出”,它不会出现要崩溃了。苹果应该提供到退出应用程序的有效方法(未退出(0))。
这已经得到了一个很好的答案,但决定扩大一点:
你不能让你的应用程序接受AppStore上没有阅读苹果的iOS人机界面指南好。 (他们保留拒绝你这样做的什么权的对他们)的部分“不以编程方式退出”的 http://developer.apple.com/library/ios/#DOCUMENTATION/UserExperience/Conceptual/MobileHIG/UEBestPractices/UEBestPractices.html 一> 是你应该如何在这种情况下,治疗的精确指导。
如果你曾经有苹果平台的问题,你不能轻易找到一个解决方案,咨询HIG。这是可能的苹果根本不希望你这样做,他们通常(我不是苹果,所以我不能总是保证)都在其文档中这样说。
我们不能使用exit(0)
,abort()
功能,苹果公司强烈反对使用这些功能的应用程序退出。虽然你可以使用此功能开发或测试目的。
如果在开发过程中或测试有必要终止您 应用,中止功能,或断言宏建议
请发现这个苹果 Q&A 线程以获取更多信息
作为该函数的使用创建像应用印象崩溃。所以我得到了一些建议像我们可以大约关闭应用程序,由于某些功能不可用与终止消息显示警报以意识到用户。
但iOS的人机界面指南为启动和停止应用程序,提示的不要使用退出或关闭按钮以终止应用。而不是它们暗示来显示适当的消息来解释的情况。
这是iOS应用从未显示关闭或者退出选项。人们停止使用 应用程序时,他们切换到另一个应用程序,返回到主屏幕,或将 它们在睡眠模式下的设备。
从不编程退出iOS应用。人们往往解释这 作为崩溃。如果有什么可以防止您的应用为运作 意,你需要告诉用户有关情况,并解释了什么 它们可以做的。
在除了上述好,回答我只是想补充一点,想清理你的记忆。
在您的应用程序退出时,iPhone OS会自动清理任何应用程序留下来的,所以手动释放所有的内存可以只增加所花费的时间你的应用程序退出的金额。
嗯,你可以“必须”如果说,你的应用程序需要互联网连接退出应用程序。你可以显示一个警报,然后做这样的事情:
if ([[UIApplication sharedApplication] respondsToSelector:@selector(terminate)]) {
[[UIApplication sharedApplication] performSelector:@selector(terminate)];
} else {
kill(getpid(), SIGINT);
}
- (IBAction)logOutButton:(id)sender
{
//show confirmation message to user
CustomAlert* alert = [[CustomAlert alloc] initWithTitle:@"Confirmation" message:@"Do you want to exit?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];
alert.style = AlertStyleWhite;
[alert setFontName:@"Helvetica" fontColor:[UIColor blackColor] fontShadowColor:[UIColor clearColor]];
[alert show];
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex != 0) // 0 == the cancel button
{
//home button press programmatically
UIApplication *app = [UIApplication sharedApplication];
[app performSelector:@selector(suspend)];
//wait 2 seconds while app is going background
[NSThread sleepForTimeInterval:2.0];
//exit app when app is in background
NSLog(@"exit(0)");
exit(0);
}
}
我使用的[[NSMutableArray的新] ADDOBJECT:无]上面提到到的方法强制退出(崩溃)应用程序而不进行搬弄是非出口(0)函数调用
。为什么呢?因为我的应用程序在所有网络API使用证书钉扎呼吁防止人在这方面的中间人攻击。这些措施包括初始化叫我的财务应用程序,使得在启动时。
如果证书验证失败,我所有的初始化调用错误了,离开我的应用程序处于不确定状态。让用户回家再回到应用程序没有帮助,因为除非应用程序已经通过它仍然未初始化和不可信的操作系统中清除。
那么,在这样一个情况下,我们认为最好弹出一个警告通知该应用程序是在不安全的环境中运行,然后,当他们点击“关闭”的用户,力使用上述方法退出应用程序。
[[UIApplication sharedApplication] terminateWithSuccess];
它工作得很好,并自动调用
- (void)applicationWillTerminateUIApplication *)application delegate.
以除去编译时警告添加此代码
@interface UIApplication(MyExtras)
- (void)terminateWithSuccess;
@end
用户应当决定一个应用程序退出。 我不认为这是一个很好的用户交互当一个应用程序退出。因此,存在对于它没有很好的API,只有主按钮有一个。
如果有错误:更好地执行它或者通知用户。 如果有必须重新启动:实现更好通知用户的
这听起来很愚蠢,但它是不好的做法,退出应用程序,而不让用户决定不通知他。并且由于存在用于用户交互的主页按钮,苹果指出,不应该有相同功能事情2(离开一个应用程序)。
退出应用程式其他方式比主按钮是的真非-IOS式的强>方法
我这样做帮手,虽然,不使用私人的东西:
void crash()
{ [[NSMutableArray new] addObject:NSStringFromClass(nil)]; }
但仍然并不是为生产在我的情况。这是检验碰撞reportings,或到核心数据复位后快速重启。只是做它的安全功能,如果在生产代码留下不被拒绝。
夫特4.2(或以上)
库称为Darvin
都可以使用。
import Darwin
exit(0) // Here you go
NB:这不是在IOS应用recomanded。
这样做将让你崩溃日志。
您不应该直接调用函数exit(0)
因为它会立即退出应用程序,并会像您的应用程序崩溃。因此,更好地向用户展示确认警报,让他们做这自己。
夫特4.2
func askForQuit(_ completion:@escaping (_ canQuit: Bool) -> Void) {
let alert = UIAlertController(title: "Confirmation!", message: "Do you want to quit the application", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Yes", style: UIAlertAction.Style.default, handler: { (action) in
alert.dismiss(animated: true, completion: nil)
completion(true)
}))
alert.addAction(UIAlertAction(title: "No", style: UIAlertAction.Style.cancel, handler: { (action) in
alert.dismiss(animated: true, completion: nil)
completion(false)
}))
self.present(alert, animated: true, completion: nil)
}
/// Will quit the application with animation
func quit() {
UIApplication.shared.perform(#selector(NSXPCConnection.suspend))
/// Sleep for a while to let the app goes in background
sleep(2)
exit(0)
}
用法:
self.askForQuit { (canQuit) in
if canQuit {
self.quit()
}
}
退出一个应用程序的其它方法
我这样做帮手,虽然,不使用私人的东西:
退出(0);
如果应用程序是一个长期运行的应用程序,并且也在后台执行,则退出应用程序可能是合适的,例如获取位置更新(使用 位置更新 的背景能力)。
例如,假设用户注销基于位置的应用程序,并使用主页按钮将该应用程序推送到后台。在这种情况下,您的应用程序可能会继续运行,但完全退出它可能是有意义的。这对用户有好处(释放内存和其他不需要使用的资源),并且有利于应用程序稳定性(即确保应用程序在可能的情况下定期重新启动是防止内存泄漏和其他低内存问题的安全网)。
这可以(尽管可能不应该,见下文:-)通过以下方式实现:
- (void)applicationDidEnterBackground:(UIApplication *)application
{
if (/* logged out */) {
exit(0);
} else {
// normal handling.
}
}
由于应用程序随后将退出 脱离背景 如果用户下次运行应用程序时恢复用户界面,那么它不会对用户来说看起来有问题,也不会类似于崩溃。换句话说,对于用户来说,当应用程序在后台时,它看起来与系统发起的应用程序终止没有任何不同。
尽管如此,最好使用更标准的方法让系统知道应用程序可以终止。例如,在这种情况下,通过停止请求位置更新来确保 GPS 未在使用中,包括关闭在地图视图上显示当前位置(如果存在)。这样系统将在几分钟内终止应用程序(即 [[UIApplication sharedApplication] backgroundTimeRemaining]
)应用程序进入后台后。这将获得所有相同的好处,而无需使用代码来终止应用程序。
- (void)applicationDidEnterBackground:(UIApplication *)application
{
if (/* logged out */) {
// stop requesting location updates if not already done so
// tidy up as app will soon be terminated (run a background task using beginBackgroundTaskWithExpirationHandler if needed).
} else {
// normal handling.
}
}
当然,使用 exit(0)
根据引用的其他答案,永远不适合在前台运行的平均生产应用程序 http://developer.apple.com/iphone/library/qa/qa2008/qa1561.html