我遇到过这种情况,我第一次将应用状态恢复API添加到支持iOS 9.3及更高版本的新应用中。状态恢复在功能上运行良好,但我注意到它显示屏幕快照而不是LaunchScreen.xib内容,因为状态恢复期间的延迟。通过快照,我指的是iOS应用程序UI在进入后台时的自动截图。
如果您不知道应用程序状态恢复是什么,它是iOS 6出来的,这是Apple上的链接:
Apple Documentation on App State Saving & Restoring
在此应用案例中显示屏幕快照是一个重大问题,因为在应用状态恢复期间,此特定应用在运行iOS 9.3.5的iPhone 4上有大约4秒的延迟。由于在此期间未显示启动/启动画面,因此用户会感知应用程序已挂起。这种情况在模拟器和设备上的当前可用的所有iOS版本上都会重现。
如何防止显示快照,并强制始终使用LaunchScreen.xib,同时仍然保留应用状态保存/恢复功能的好处?
答案 0 :(得分:5)
经过研究,我发现Apple很久以前提供了一种解决这种情况的UIApplication方法。但是它的使用,即使在今天,也没有很好的记录。
解决方案是使用UIApplication中的ignoreSnapshotOnNextAppliationLaunch方法。
Apple ignoreSnapshotOnNextApplicationLaunch method
您将不得不通过Apple建议的UIApplication单例模式访问它,我将在此解释:
Apple UIApplication sharedApplication method
使用这个是没有明确记录的内容,我在这里分享。除非在iOS从视图控制器保存应用程序状态时专门调用,否则ignoreSnapshotOnNextApplicationLaunch方法将完全没有效果。例如,当您点击主页按钮以后台应用程序。
您不能直接从处理后台/前景转换的AppDelegate方法调用此方法,因为需要从视图控制器调用它们的状态,以便以后恢复。
对于此保存任务,Apple提供了来自UIViewController的encodeRestorableStateWithCoder方法
Apple encodeRestorableStateWithCoder method
这就是我们需要做出改变的地方。如果进行状态恢复,你应该已经拥有它;但是通过将此方法调用添加到每个视图控制器类(其中您在故事板中设置了恢复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删除以前保存的快照文件。