如何优雅地退出iPhone应用程序?

3
或者“如何模拟按下主页按钮事件?”
我需要重新启动我的iPhone应用程序,并且我希望程序退出,这样用户只需要启动它即可。
如果我简单地使用exit(0),一些更改将无法保存,因为它们会像用户通过按主页按钮退出一样。
需要重启以进行语言更改。
相关代码:
- (void)onChangeLanguage: (id)sender {
    NSArray *lang = [NSArray arrayWithObjects:((Whatever *)sender).newLanguage, nil];
    [[NSUserDefaults standardUserDefaults] setObject:lang forKey:@"AppleLanguages"];
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSArray *languages = [defaults objectForKey:@"AppleLanguages"];
    NSString *currentLanguage = [languages objectAtIndex:0];

    NSLog(@"Current language: %@", currentLanguage);
    // ***
}   

如果用户使用主页按钮重新启动,则语言将更改。

如果// ***被替换为exit(0),则语言不会更改。


如果您强制NSUserDefaults使用特定的bundle,则无需重新启动以进行语言更改。请参见https://dev59.com/LnI-5IYBdhLWcg3wy70d#1746920 - Jano
3个回答

7

调用exit(0)是从您的代码中退出程序的唯一合法方式(但强烈不建议使用)。
作为一种可能的解决方法,您可以显示一个没有按钮且无法关闭的UIAlertView(强制用户手动退出程序),并告诉用户他必须这样做才能应用您的更改。


为什么不建议调用 exit 函数? - zoul
这对我来说似乎是糟糕的界面设计。 - MattC
啊哈,从工程角度来看并没有错吗?我同意突然退出应用程序对用户来说是不公平的,但有时它是完全有效的 - 例如,如果您有一个退出按钮。(出于某种原因,许多应用程序都有这个功能。) - zoul
4
从苹果的人机界面指南中引用: “iPhone 应用程序不应该以编程方式退出,因为这样做会给用户造成崩溃的感觉。 然而,在一些外部情况下阻止了你的应用程序正常运行。当出现这种情况时,你需要告知用户当前的状况,并解释他们可以采取哪些措施。这样,用户可以决定是纠正问题并继续使用你的应用程序,还是按Home按钮并打开另一个应用程序。” - Vladimir
我同意显示这个警告很丑...也可以只显示一个提示说明(一次性的),告诉用户在重新启动应用程序之前不会应用更改。 - Vladimir

5

我认为在调用exit之前,只需调用[[NSUserDefaults standardUserDefaults] synchronize]即可。你可以在Apple文档中了解有关synchronize方法的详细信息:

由于此方法会定期自动调用,因此只有在无法等待自动同步(例如,如果您的应用程序即将退出)或者即使您没有进行任何更改也要更新用户默认设置时,才使用此方法。


3
值得注意的是,还有一个私有API调用。当然,所有使用私有API的常见警告都适用。
[[UIApplication sharedApplication] terminate];

好的,"使用私有 API 的常见警告" 是什么意思? - shinjin
通常的警告是:(1)您的应用程序可能会被App Store拒绝,(2)私有API不能保证稳定性,这意味着您的应用程序可能会在新固件中轻易崩溃。 - zoul
没错。现在苹果正在扫描使用私有API调用的应用程序,以拒绝它们进入应用商店,这使得事情变得更加棘手。使用私有API并不是一个好选择,但exit(0)也不完全正确(应用程序应该首先触发通知)。显示警报来要求用户按下主页按钮并重新启动应用程序可能是最好的方法,并且与苹果的HIG最一致。 - Jeremy Bower

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接