防止应用从后台返回时出现启动画面

12


我注意到在我开发的每个应用程序中都会出现一些情况。通常这不是什么问题,但在这个特定的应用程序中,如果能够“修复”它(即使这是一个bug),那就太好了。

重现问题的步骤:

  • 启动应用程序,启动画面显示大约3秒钟,然后应用程序开始运行。
  • 按Home键,应用程序进入后台。
  • 从后台恢复应用程序(双击Home屏幕并选择它),会显示闪屏约半秒钟左右,然后应用程序重新启动。

是否有可能消除从后台返回时闪屏突然弹出约半秒钟的情况?对于这个特定的应用程序确实是一个问题。


1
请确保在您的应用程序的plist中,将“应用程序不在后台运行”设置为NO(原始键:UIApplicationExitsOnSuspend)。有些应用程序希望在用户将其置于后台时被“杀死”,因此它们使用此键。但是,要恢复您的应用程序,您必须允许它在后台运行(实际上是暂停,不必在后台实际工作)。 - Sam
它并没有真正改变任何东西,仍然在从后台返回时,闪屏会出现一瞬间... - Shai Mishali
你的代码是否会在 application:didFinishLaunchingWithOptions: 中运行两次(通过断点或 NSLog 验证)?我不确定如果你没有使用 UIApplicationExistsOnSuspend 键(将应用程序在后台时终止),如何让启动屏幕(default.png)每次启动应用程序都出现。除非... 应用程序在退出时意外地被杀死,例如在 applicationDidEnterBackground:applicationWillResignActive: 中发生 SIGABRT。 - Sam
所以你的意思是我应该将它设置为YES,而不是NO。(这样它就会立即被杀死),但这并不是真正的解决办法,因为我不想让应用程序每次用户关闭它时都死掉... - Shai Mishali
UIApplicationExistsOnSuspend 的默认值为 NO(意味着应用程序在后台时不会被杀死)。因此,请确保此键/值对丢失或设置为 NO,以便在后台时不会杀死您的应用程序。抱歉,我使用了大写字母来强调“no”和“not”,只是为了尽可能清楚。另外,当您将应用程序放入后台时,调试会话不应该结束,因此您应该能够在 applicationWillEnterForeground: 上设置断点以验证您的会话未结束(应用程序未死亡)。 - Sam
我不确定方向,Sam,也许我只是没有跟上你的步伐,但它被设置为NO,并且应用程序没有被杀死,它被保留在后台 - 这与弹出式闪屏的问题有什么关系?谢谢,伙计 :) - Shai Mishali
5个回答

13

我知道这个问题标记为“已回答”,但实际上答案在我的情况下是不正确的,我想分享一下。

起初,我得出的结论是,以上最准确的答案来自QueyJoh - “这是由iOS处理的...简短的回答:这是无法控制的。”

然而,经过试验,我成功地将问题定位为我info.plist文件中控制状态栏的条目。具体来说,我有“UIStatusBarHidden”和“UIStatusBarStyle”的条目。

从我的plist文件中删除这些条目立即停止了我的应用程序在从我的应用程序切换出去并再次返回时显示启动画面的情况。

问题解决了。

马修


谢谢。那真是让我抓狂了。 - pfs
在我的情况下,当我使用 LaunchScreen.xib 时,这并没有帮助我,但是当我使用 LaunchImage 时,这就不再需要了。 - Mohammad Zaid Pathan

10

显然,这个问题一开始就不太聪明 :) 这个“问题”只在模拟器中发生。在设备本身上进行调试时,它的表现符合预期。

没有造成任何伤害。感谢每一个试图帮助我的人! :)


1
不错的问题。许多人可能也会遇到这个问题,直到像你一样发现它是模拟器特定的才知道发生了什么。将其标记为答案。 - Sam
它还不让我,稍后我会的 :) 谢谢你,Sam! :) - Shai Mishali
实际上,我刚在我的5.1设备上遇到了这个问题。有时会显示启动画面,有时不会,但是didFinishLaunchingWithOptions没有再次触发。 - Setomidor

9
根据我的经验,这是由iOS处理的(我之所以这么说是因为我没有看到任何相关文档)。如果操作系统能够快速恢复应用程序状态,它将在恢复该状态时显示其先前状态的屏幕截图。
但是,如果出现什么会延迟此过程的情况,例如应用程序尚未正确处于后台(例如在快速任务切换期间),或者如果其他可预测的事情将延迟启动时间,则会回退到闪屏界面(而不是屏幕截图),以便缓解用户体验。
简短的答案是:你无法控制这个过程。

1
您正在回答一个已经得到答复的问题。就像我所说的,问题出在模拟器上,在您的设备上并没有出现这个问题。 - Shai Mishali
4
我添加了这个答案,因为我在自己的项目中看到了这种情况,且不得不回答客户关于此事的问题,所以我觉得一个更详尽的讨论对未来的旅行者有价值。 - QueyJoh
好的,抱歉给你点了踩。我通常认为回答已经关闭的问题并不是一个好的做法,特别是当答案并没有什么重要性时(“这不在你的掌控之中”)。但我还是很感激你的努力。 - Shai Mishali

0

我也遇到了这个问题,现在我已经解决了。原因是你在 applicationDidEnterBackground 中做了太多的事情,尝试减少一些。


0

在 didFinishLaunchingWithOptions 方法中,您的代码应该用于显示启动画面。如果是这样,它只会在您的应用程序实际启动时出现,而不是从后台返回时出现。

可以使用类似以下的代码(我知道它使用旧的动画代码,但我相信您可以根据需要更新为块)...

    splashView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 20, 320, 460)];
    splashView.image = [UIImage imageNamed:@"Default.png"];

    [myWindow addSubview:splashView];
    [myWindow bringSubviewToFront:splashView];
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.5];
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDidStopSelector:@selector(startupAnimationDone:finished:context:)];
    splashView.alpha = 0.0;
    [UIView commitAnimations];

然后创建一个名为startupAnimationDone的方法...

- (void)startupAnimationDone:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {

    [splashView removeFromSuperview];

    [splashView release];
}

1
我认为@Shai Mishali指的是在应用程序重新回到前台时显示的"Default.png"文件。不幸的是,无法更改此行为,当您的应用程序再次变为活动状态时,图像是否显示取决于许多因素,但从我所知道的来看,主要取决于此时可用的内存。 - Rog
1
我尝试过类似这样的操作,但问题在于如果您不指定启动画面,则会在应用程序准备就绪之前显示黑屏,然后才会显示启动画面。我能否以某种方式“取消”默认启动画面,以便在启动时不会出现黑屏? - Shai Mishali
你可以在应用程序进入applicationWillResignActive之前抓取屏幕的副本,将default.png重命名为其他名称,然后将此抓取的图像重命名为default.png - 我想这就是像Kobo这样的阅读应用程序在即将进入后台时所做的。我自己没有做过这个,所以这只是一个假设。通常,我想在applicationDidBecomeActive中立即获取自己的图像,无论它是什么,都会非常快速,这样用户就不必看到黑屏。 - amergin

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