正确的方式退出iPhone应用程序?
我正在编程一个iPhone应用程序,我需要迫使它由于某些用户操作而退出。 清理内存分配的应用程序后,有什么适当的方法来调用来终止应用程序?
你有没有尝试过exit(0)
?
或者, [[NSThread mainThread] exit]
,虽然我还没有尝试过,似乎是更合适的解决scheme。
在iPhone上没有退出应用程序的概念。 导致应用程序退出的唯一操作是触摸手机上的主页button,这不是开发人员可以访问的内容。
根据苹果,你的应用程序不应该自行终止。 由于用户没有点击主页button,任何返回到主屏幕给用户的印象是你的应用程序崩溃。 这是混乱,不规范的行为,应该避免。
退出(0)对用户来说显示为崩溃,因此向用户显示确认消息。 在确认暂停(主页按下编程)并等待2秒,而应用程序正在与animation背景,然后退出用户的观点后面
-(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];
转到您的info.plist并检查“应用程序不在后台运行”键。 这次当用户点击主页button时,应用程序完全退出。
在这里查看问答: https : //developer.apple.com/library/content/qa/qa1561/_index.html
问:如何以编程方式退出我的iOS应用程序?
没有API提供优雅地终止iOS应用程序。
在iOS中,用户按下主页buttonclosures应用程序。 如果您的应用程序具有不能提供其预期function的条件,则build议的方法是向用户显示警报,指出问题的性质以及用户可能采取的措施 – 打开WiFi,启用定位服务等。允许用户自行决定终止应用程序。
警告:不要调用
exit
function。 应用程序调用exit
将出现在用户崩溃,而不是执行优美的终止和animation返回到主屏幕。另外,可能不会保存数据,因为
-applicationWillTerminate:
如果调用exit,则不会调用类似的UIApplicationDelegate
方法。如果在开发或testing过程中有必要终止您的应用程序,build议使用
abort
函数或assert
macros
在application-info.plist上添加UIApplicationExitsOnSuspend属性为true
经过一些testing,我可以说以下几点:
- 使用私人接口:
[UIApplication sharedApplication]
将导致应用程序看起来像崩溃,但它会在这样做之前调用- (void)applicationWillTerminate:(UIApplication *)application
; - 使用
exit(0);
也将终止应用程序,但它会看起来“正常”(跳板的图标出现像预期的,缩小效果),但它不会调用- (void)applicationWillTerminate:(UIApplication *)application
委托方法。
我的build议:
- 在代理上手动调用
- (void)applicationWillTerminate:(UIApplication *)application
。 - 调用
exit(0);
。
你的ApplicationDelegate得到用户有意中断的通知:
- (void)applicationWillResignActive:(UIApplication *)application {
当我收到这个通知时,我只是打电话
exit(0);
哪些工作完成 而最好的是,这是用户意图退出,这就是为什么这不应该成为一个问题。
在我的audio应用程序有必要退出应用程序,同时人们同步他们的设备,而音乐仍在播放。 只要同步完成,我会收到通知。 但之后退出应用程序实际上看起来像一个崩溃。
所以相反,我设置了一个标志,真正退出下一个背景行动的应用程序。 同步后刷新应用程序可以。
我的应用程序最近被拒绝了我用了一个没有logging的方法。 从字面上看:
“不幸的是,它不能被添加到应用程序商店,因为它使用的是私有API。禁止使用iPhone开发者计划许可协议第3.3.1节中概述的非公共API:
“3.3.1应用程序只能按照Apple规定的方式使用文档化的API,不得使用或调用任何私有API。”
包含在您的应用程序中的非公共API是terminateWithSuccess“
苹果说:
“警告:不要调用退出函数,调用退出的应用程序将出现在用户崩溃,而不是执行优美的终止和animation返回到主屏幕。
我认为这是一个不好的假设。 如果用户点击一个退出button,并出现一条消息,说:“应用程序现在将退出”,它似乎并没有崩溃。 苹果应该提供一个有效的方式来退出应用程序(不退出(0))。
这已经得到了很好的答案,但决定扩大一点:
如果不能很好地阅读苹果的iOS人机界面指南,就不能把你的应用程序接受到AppStore。 (他们保留拒绝您对他们做任何事情的权利)“不要以编程方式退出”部分http://developer.apple.com/library/ios/#DOCUMENTATION/UserExperience/Conceptual/MobileHIG/UEBestPractices/UEBestPractices。在这种情况下,; html是一个准确的指导方针。
如果你有苹果平台的问题,你不能轻易find解决scheme,请咨询HIG。 苹果可能不希望你这样做,他们通常(我不是苹果公司,所以我不能保证总是这样)在文档中这么说。
我们不能使用exit(0)
和abort()
函数退出应用程序,因为Apple强烈build议不要使用这些函数。 尽pipe您可以使用此function进行开发或testing。
如果在开发或testing过程中有必要终止您的应用程序,build议使用中断函数或断言macros
请查找此Apple Q&A线程以获取更多信息。
由于使用此function创build像应用程序崩溃的印象。 所以我有一些build议,像我们可以显示警告与终止消息知道用户closures应用程序,由于无法使用某些function。
但iOS人机界面启动和停止应用程序指南,build议不要使用退出或closuresbutton来终止应用程序。 相反,他们build议显示适当的信息来解释情况。
iOS应用程序从不显示closures或退出选项。 当用户切换到其他应用程序,返回到主屏幕或将其设备置于睡眠模式时,用户将停止使用应用程序。
切勿以编程方式退出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); } }
以主页button之外的方式退出应用程序实际上是非iOStypes的方法。
我做了这个帮手,但是没有使用私人的东西:
void crash() { [[NSMutableArray new] addObject:NSStringFromClass(nil)]; }
但在我的情况下,仍然不意味着生产。 它用于testing崩溃报告,或在核心数据重置后快速重启。 只要function留在生产代码中,就不会被拒绝。
我使用上面提到的[[NSMutableArray new] addObject:nil]方法强制退出(崩溃)应用程序,而不进行告诉退出(0)函数调用。
为什么? 因为我的应用程序使用所有networkingAPI调用上的证书来防止中间人攻击。 这些包括我的财务应用程序启动时的初始化调用。
如果证书身份validation失败,我的所有初始化调用都会出错,并使我的应用程序处于不确定状态。 让用户回家,然后回到应用程序没有帮助,因为除非应用程序已被操作系统清除,它仍然是未初始化和不可靠的。
因此,在这种情况下,我们认为最好popup一个提醒通知用户应用程序正在不安全的环境中运行,然后当他们点击“closures”时,使用上述方法强制退出应用程序。
用户应该决定什么时候应用程序退出。 我不认为这是一个很好的用户互动,当一个应用程序退出。 因此,没有好的API,只有主页button有一个。
如果出现错误:更好地实施或通知用户。 如果必须重新启动,请执行以下操作:通知用户。
这听起来很愚蠢,但退出应用程序是不好的做法,而不让用户决定并不通知他。 而且由于用户交互有一个主页button,苹果说,相同function(退出应用程序)不应该有两件事情。
以其他方式退出应用程序
我做了这个帮手,但是没有使用私人的东西:
出口(0);
如果应用程序是一个长期存在的应用程序,并且在后台执行,例如获取位置更新(使用位置更新后台function),则退出该应用程序可能是合适的。
例如,假设用户从您的基于位置的应用程序注销,并使用主页button将应用程序推到后台。 在这种情况下,您的应用可能会继续运行,但完全退出可能会有意义。 这对用户来说是好事(释放内存和其他不需要使用的资源),对于应用程序的稳定性也很好(例如,确保应用程序在可能的情况下定期重新启动,以防止内存泄漏和其他低内存问题)。
这可能(虽然可能不应该,见下文:-)可以通过如下方式实现:
- (void)applicationDidEnterBackground:(UIApplication *)application { if (/* logged out */) { exit(0); } else { // normal handling. } }
由于应用程序会退出后台,所以用户看起来不会出错,并且不会像崩溃,只要用户界面下次运行应用程序即可恢复。 换句话说,对于用户来说,当应用程序处于后台时,与系统启动的应用程序终止不会有什么不同。
不过,最好是使用更标准的方法让系统知道应用程序可以被终止。 例如,在这种情况下,通过停止请求位置更新来确保GPS未被使用,包括closures在地图视图上的显示当前位置(如果存在)。 这样,系统将在应用程序进入后台后几分钟处理终止应用程序(即[[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
[[UIApplication sharedApplication] terminateWithSuccess];
它工作正常,自动调用
- (void)applicationWillTerminateUIApplication *)application delegate.
删除编译时间警告添加此代码
@interface UIApplication(MyExtras) - (void)terminateWithSuccess; @end