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

我遇到过这种情况,我第一次将应用程序状态恢复API添加到支持iOS 9.3及更高版本的新应用程序中。 状态恢复在function上运行良好,但我注意到它显示屏幕快照而不是LaunchScreen.xib内容,因为状态恢复期间的延迟。 通过快照,我指的是iOS进入后台时自动截图iOS应用程序UI。

如果您不知道应用程序状态恢复是什么,它就出现在iOS 6中,这是Apple上的链接:

应用程序状态保存和恢复的Apple文档

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

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

经过研究,我发现Apple很久以前就提供了一种解决这种情况的UIApplication方法。 但它的使用,即使在今天,也没有很好的记录。

解决方案是使用UIApplication中的ignoreSnapshotOnNextAppliationLaunch方法。

Apple ignoreSnapshotOnNextApplicationLaunch方法

您将不得不通过Apple建议的UIApplication单例模式访问它,我将解释:

Apple UIApplication共享应用方法

哪里使用这个是没有明确记录的,我在这里分享。 除非在iOS从视图控制器保存应用程序状态时专门调用,否则ignoreSnapshotOnNextApplicationLaunch方法将完全没有效果。 例如,当您点按主页按钮以后台应用程序。

您不能直接从处理后台/前景转换的AppDelegate方法调用此方法,因为需要从视图控制器调用它们的状态,以便以后恢复。

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

Apple encodeRestorableStateWithCoder方法

这就是我们需要做出改变的地方。 如果进行状态恢复,你应该已经拥有它; 但是通过将此方法调用添加到每个视图控制器类(其中您在故事板中设置了还原ID,或者手动保存状态),您可以通过包含UIApplication单例中的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删除以前保存的快照文件。