Ios 在状态恢复期间显示应用程序屏幕快照,而不是启动屏幕

Ios 在状态恢复期间显示应用程序屏幕快照,而不是启动屏幕,ios,objective-c,uiapplication,Ios,Objective C,Uiapplication,我遇到了这种情况,我第一次将应用程序状态恢复API添加到支持iOS 9.3及更高版本的新应用程序中。状态恢复功能正常,但我注意到它显示的是一个屏幕快照,而不是LaunchScreen.xib内容,因为状态恢复过程中存在延迟。通过快照,我指的是iOS在你的应用程序界面进入后台时自动拍摄的屏幕截图 如果你不知道什么是应用程序状态恢复,它是iOS 6推出的,下面是苹果的链接: 在这个应用程序案例中显示屏幕快照是一个重大问题,因为在运行iOS 9.3.5的iPhone 4s上,这个特定的应用程序在应用

我遇到了这种情况,我第一次将应用程序状态恢复API添加到支持iOS 9.3及更高版本的新应用程序中。状态恢复功能正常,但我注意到它显示的是一个屏幕快照,而不是LaunchScreen.xib内容,因为状态恢复过程中存在延迟。通过快照,我指的是iOS在你的应用程序界面进入后台时自动拍摄的屏幕截图

如果你不知道什么是应用程序状态恢复,它是iOS 6推出的,下面是苹果的链接:

在这个应用程序案例中显示屏幕快照是一个重大问题,因为在运行iOS 9.3.5的iPhone 4s上,这个特定的应用程序在应用程序状态恢复期间有大约4秒的延迟。用户会感觉到应用程序被挂起,因为在此期间没有显示启动/启动屏幕。这种情况会在当前可用的所有iOS版本(模拟器和设备)上重现


如何防止快照显示,并强制始终使用LaunchScreen.xib,同时仍保留应用程序状态保存/还原功能的好处?

研究此问题后,我发现苹果很久以前就提供了一种脱离UIApplication的方法来处理这种情况。但是,即使在今天,它的使用仍然缺乏文档记录

解决方案是使用UIApplication中的IgnoreSnappshotOnExtAppliationLaunch方法

您必须按照苹果的建议,通过UIApplication singleton模式访问它,我将解释如下:

在哪里使用这是什么没有明确记录,我在这里分享。IgnoreSnappshotOnExtApplicationLaunch方法将完全无效,除非在iOS从视图控制器保存应用程序状态时特别调用。例如,当您点击home(主页)按钮以设置应用程序的背景时

不能直接从处理背景/前景转换的AppDelegate方法调用此方法,因为需要在保存视图控制器的状态以供以后恢复时从视图控制器调用此方法

对于此保存任务,Apple从UIViewController提供encodeRestorableStateWithCoder方法

这就是我们需要做出改变的地方。如果进行状态恢复,您应该已经拥有它;但是,通过将此方法调用添加到在序列图像板中设置还原ID或手动保存状态的每个视图控制器类,可以通过包含UIApplication singleton中的ignoreSnapshotOnNextApplicationLaunch来避免使用任何快照。这将阻止iOS拍摄快照,只是在重新启动时恢复应用程序状态时不显示快照

// save any app state information that is not already saved automatically
- (void)encodeRestorableStateWithCoder:(NSCoder *)coder {

    // prevent taking a screen shapshot and force launchScreen xib to be used always
    [[UIApplication sharedApplication] ignoreSnapshotOnNextApplicationLaunch];

    [super encodeRestorableStateWithCoder:coder];

    return;
}

请确保在测试过程中添加此项后重新设置应用程序的背景,以便iOS删除以前保存的快照文件。

谢谢您的回答,我已经尝试过这种方法,但我的应用程序在启动应用程序时会不断显示Apple拍摄的屏幕截图。我错过了这篇文章中没有提到的任何东西吗?这篇文章是很多年前的事了,但我记得每个视图控制器都必须有方法encodeRestorableStateWithCoder,如图所示来解决这个问题。嗯,我尝试将这个问题隔离到一个只有一个视图控制器的示例应用程序中,但问题仍然出现。然而,我使用的是iPhone6,而X完全没有问题。这一事实使这个问题更加奇怪。无论如何,谢谢你的回答@castillejoale,你找到解决方案了吗?@nemissm,不幸的是没有,我正在制作一个原型,所以改用iPhoneX就足够了。你在用哪部iPhone?