【问题标题】:App screen snapshot being shown instead of launchScreen during state restoration在状态恢复期间显示应用程序屏幕快照而不是 launchScreen
【发布时间】:2017-04-23 12:52:35
【问题描述】:

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

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

Apple Documentation on App State Saving & Restoring

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

如何防止显示快照,并强制始终使用 LaunchScreen.xib,同时仍保留应用状态保存/恢复功能优势?

【问题讨论】:

    标签: ios objective-c uiapplication


    【解决方案1】:

    经过研究,我发现 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 删除之前保存的快照文件。

    【讨论】:

    • 感谢您的回答,我已经尝试过这种方法,但我的应用程序一直显示 Apple 在启动应用程序时拍摄的屏幕截图。我是否错过了这篇文章中未指定的任何内容?
    • 这篇文章是很多年前的事了,但我记得每个视图控制器都必须有如图所示的方法 encodeRestorableStateWithCoder 来解决问题
    • 嗯,我尝试将问题隔离到只有一个视图控制器的示例应用程序中,但问题仍然出现。不过我用的是 iPhone 6,用 X 一点问题都没有。这一事实使这个问题更加奇怪。不管怎样,谢谢你的回答?
    • @castillejoale,你找到解决办法了吗?
    • @nemissm,不幸的是,我正在构建一个原型,所以换成 iPhone X 就足够了。你用的是哪款 iPhone?
    猜你喜欢
    • 2016-12-18
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 2014-04-10
    • 1970-01-01
    • 2016-11-12
    相关资源
    最近更新 更多