【问题标题】:Prevent Splash Screen from showing after returning from background防止从后台返回后显示启动画面
【发布时间】:2011-12-29 21:34:38
【问题描述】:


我注意到在我开发的每个应用程序中都会发生一些事情。这通常不是问题,但在这个特定的应用程序中,如果我能“修复”它,如果它甚至是一个错误,那就太好了。

重现问题的步骤:

  • 启动应用程序,启动屏幕显示大约3 秒后应用启动。
  • 按下主页按钮,应用程序进入后台。
  • 从后台返回应用程序(双击主屏幕并选择它),显示启动画面半秒左右,然后应用程序返回。

是否有可能摆脱从后台返回时弹出半秒钟的启动画面?对于这个特定的应用程序来说,这确实是一个问题。

【问题讨论】:

  • 确保在应用的 plist 中将 Application does not run in background 设置为 NO(原始密钥:UIApplicationExitsOnSuspend)。某些应用程序希望在用户将它们设置为背景时被“杀死”,因此它们使用此键。但是,要恢复您的应用,您必须允许它在后台运行(真正暂停,不必实际在后台运行)。
  • 它并没有真正改变任何东西,从后台返回后仍然会出现一瞬间的飞溅......
  • 您的代码是否通过application:didFinshLaunchingWithOptions: 两次(使用断点或NSLog 验证)?我不确定每次启动应用程序时如何在不使用UIApplicationExistsOnSuspend 键的情况下显示初始屏幕(default.png)(当您将其作为背景时会杀死应用程序)。除非...该应用程序在退出时被意外杀死,例如 applicationDidEnterBackground:applicationWillResignActive: 中的 SIGABRT。
  • 所以你的意思是我应该将它设置为 YES ,而不是 NO 。 (所以它会立即被杀死),但这并不是一个真正的解决方案,因为我不希望应用程序在每次用户关闭它时都死掉......
  • UIApplicationExistsOnSuspend 的默认值为 NO(意味着应用程序在后台运行时不会被终止)。因此,请确保缺少此键/值对或将其设置为 NO,以便您的应用程序在后台运行时不会被杀死。 - 很抱歉没有和没有的上限,只是想尽可能清楚。此外,当您在后台运行应用程序时,您的调试会话不应结束,因此您应该能够在 applicationWillEnterForeground: 上设置断点以验证您的会话没有结束(应用程序没有死)。

标签: iphone ios splash-screen visual-glitch


【解决方案1】:

显示初始屏幕的代码应位于应用程序委托中的 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];
}

【讨论】:

  • 我认为@Shai Mishali 指的是应用程序进入前台时显示的“Default.png”文件。不幸的是,无法更改此行为,并且当您的应用再次激活时是否显示图像将取决于许多因素,但据我所知,主要是您当时可用的内存。
  • 我尝试过这样做,但问题是如果您不指定启动画面,您将在应用程序就绪之前显示黑屏,然后才会显示启动画面。我可以以某种方式“取消”默认启动画面,这样启动时就不会出现黑屏了吗?
  • 你可以做的是在你的应用程序进入后台之前在 applicationWillResignActive 中抓取屏幕的副本,将 default.png 重命名为其他内容并将这个抓取的图像重命名为 default.png - I'想象一下,这就是 Kobo 等阅读应用程序即将进入后台时所做的事情。我自己没有这样做,所以这只是一个假设。一般来说,我想在 applicationDidBecomeActive 中立即获取您自己的图像,无论它是什么,都将是相当即时的,因此用户不必看到黑屏。
【解决方案2】:

我也有这个问题,现在解决了

【讨论】:

    【解决方案3】:

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

    我最初得出的结论是,上面最准确的答案来自 QueyJoh——“这是由 iOS 处理的……简短的回答:它不在你的掌控之中。”

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

    从我的 plist 文件中删除这些条目会立即阻止我的应用在从我的应用切换并再次切换回来时显示启动屏幕。

    问题解决了。

    马修

    【讨论】:

    • 谢谢。这让我发疯了。
    • 在我的情况下,当我使用 LaunchScreen.xib 时,这对我没有帮助,当使用 LaunchImage 时,这不是必需的。
    【解决方案4】:

    根据我的经验,这是由 iOS 处理的(我将根据经验进行,因为我没有看到任何有关此的文档)。如果操作系统可以快速恢复应用程序状态,它会在该状态恢复时显示其先前状态的屏幕截图。

    但是,如果某些事情会延迟该过程,例如应用程序尚未正常在后台(例如在快速任务切换期间),或者如果其他可预测的事情会延迟启动,那么它会恢复到启动屏幕 (而不是屏幕截图),以简化用户体验。

    简短的回答:它不在你的手中。

    【讨论】:

    • 您正在回答一个已经回答的问题。正如我所说,问题出在模拟器中,并且在您的设备上发生时并没有发生。
    • 我添加了答案,因为我在设备上的自己的项目中看到了这种情况,并且不得不回答客户对此的问题,所以我觉得更全面的讨论对于未来的旅行者来说很有价值。
    • 好的,很抱歉投了反对票。我只是通常不认为回答已经结束的问题是一种好习惯,尤其是当答案没有什么意义时(“它不在你的手中”)。不过我很感激你的努力。
    【解决方案5】:

    嗯,显然这个问题一开始就不是很聪明:) 这个“问题”只发生在模拟器中。在设备本身上调试时,它按预期工作。

    没有伤害。感谢所有试图提供帮助的人! :)

    【讨论】:

    • +1 不过,这不是一个坏问题。许多人也可能会遇到这种情况,直到他们像您一样发现它是特定于模拟器的。将此标记为答案。
    • 它还没有让我,我稍后会:) 谢谢你山姆! :)
    • 其实我的5.1设备刚刚出现这个问题。有时显示闪屏有时不显示,但 didFinishLaunchingWithOptions 不会再次触发
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 2013-02-02
    • 2018-07-16
    • 2023-03-27
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多