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

2023-11-29

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

如果您不知道什么是应用程序状态恢复,它随 iOS 6 一起推出,以下是 Apple 提供的链接:

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

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

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


经过研究,我发现Apple很早就提供了UIApplication的方法来处理这种情况。但即使在今天,其使用情况也鲜有记录。

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

Apple 忽略SnapshotOnNextApplicationLaunch 方法

您必须按照 Apple 的建议通过 UIApplication 单例模式访问它,我将对此进行解释:

Apple UIApplication 共享应用程序方法

The where使用它是没有明确记录的,我在这里分享。除非在 iOS 从视图控制器保存应用程序状态时专门调用,否则ignoreSnapshotOnNextApplicationLaunch 方法绝对不会产生任何效果。例如,当您点击主页按钮使应用程序后台运行时。

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

对于此保存任务,Apple 提供了 UIViewController 中的encodeRestorableStateWithCoder 方法

苹果encodeRestorableStateWithCoder方法

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在状态恢复期间显示应用程序屏幕快照而不是启动屏幕 的相关文章

随机推荐

  • 让 foo(衍生对象) 调用 foo(Base const&) 而不是模板函数?

    鉴于此代码 template lt class C gt void foo C const o o nosuch struct Base void foo Base const struct Derived Base auto main g
  • 通过ajax提交多个表单

    我试图通过 ajax post 提交多个表单 但问题是服务器在 post 中返回一个空数组 这是我的JS中的代码 check test click function e e preventDefault e stopPropagation
  • 在多用户访问环境中立即“锁定”一条记录

    因此 Access 中的记录锁定非常糟糕 我无法使用内置记录锁定 因为它锁定记录的 页面 而不仅仅是单个记录 我已尝试更改使用记录级锁定的设置 但它仍然锁定页面而不仅仅是锁定一条记录 但即使我可以让它工作 它也无法解决我的问题 因为在用户开
  • 首先,反思动态类型以判断它是否是动态类型

    有没有一种方法可以判断对象分配的类型是否是动态类型 例如 dynamic foo GetCat Console WriteLine foo is Cat ToString will print True because at the exe
  • Excel/VBA 细分字段

    我必须完成一项复杂的任务 但我会尝试解释 我有一个包含 23000 行数据的 Excel 文件 我正在将其导入到网站中 每个都有一个像这样的字段 Category other data other data 2 Foods Dog Trea
  • Laravel 5.3 更改 Auth 中的用户表

    我正在使用 Laravel 5 3 并使用make authartisan 命令来搭建登录 注册系统 我正在以公司身份登录 所以我有一个名为Company 如何更改原始sql以获取电子邮件和密码Company表而不是User table 我
  • C++ 宏中的语句

    阅读 chromium 代码 发现有助于处理 POSIX 兼容系统上系统调用的 EINTR errno 的宏 这是代码 base posix eintr wrapper h define HANDLE EINTR x decltype x
  • Redis tcp 积压

    有人知道如何解决redis启动时的问题吗 redis 版本 2 4 17 它来自 etc init d redis 4986 start redis 4986 conf tcp backlog 就像默认的 TCP 积压 511 Starti
  • LayoutTransform 中的 ScaleTransform 不起作用,但可与 RenderTransform 一起使用

    我正在尝试在我的应用程序中做两件事 1 缩放图像 能够做与RenderTransform 但需要实现LayoutTransform启用Scrollviewer xaml working
  • 这是什么错误:System.Runtime.InteropServices.COMException?

    我不断收到此错误 System Runtime InteropServices COMException was thrown on C Users documents visual studio 2010 Projects TBrowse
  • IBM Worklight - Mac - “'WEBWORKS_HOME' 环境变量未定义”

    我正在 Mac OS X 上的 IBM worklight 上设置 BlackBerry 10 环境 我非常确定我已正确添加 WebWorks SDK 的环境变量 我在这两个文件中添加了这两行 profile bash profile ex
  • Grails:刷新依赖项

    我正在使用 STS 有时当我在崩溃时停止我的应用程序时 它会打开一百个不同的类文件 这些文件似乎是深层的内部工作内容 HTTPBuilder 刚刚停止工作 我怀疑是因为我不小心输入了其中一个文件并心不在焉地保存了它 如果我以某种方式破坏了
  • sqlite3 with python - 查询调试 - 打印最终查询

    我正在尝试调试使用以下命令生成的 SQL 语句sqlite3蟒蛇模块 c execute SELECT FROM s WHERE column value Photo DB TABLE NAME column column value va
  • 在javascript中分割字符串一次?

    如何仅将字符串拆分一次 即 make1 Ceci n est pas une pipe Oui解析为 1 Ceci n est pas une pipe Oui 分割的限制似乎没有帮助 你想用String indexOf 获取第一次出现 的
  • 使用 ObjectListView 自定义排序

    假设我有一个包含 3 列的 objectListView ArticleNumber OrderNumber Status 8080 123 456 789 Delivered 80 456 789 101 Pending 901 11 1
  • Xcode 4 中设置的 Git 提交信息在哪里?

    请注意 这不是我面临的问题 我对这里发生的事情更感兴趣 因为这对我来说没有 多大 意义 下面显示的信息在哪里设置 根据丹尼尔 当他运行git log 提交者显示为 email protected 这是他在 Mac 上的用户名 后跟 Mac
  • 在对象数组中查找索引

    我想在数组中找到索引 数组中的位置是对象 我想过滤它们的属性 我知道我想要过滤哪些键及其值 问题是获取满足条件的数组索引 现在 我编写了代码来过滤数据并返回对象数据 但不返回数组的索引 var data text one siteid 1
  • Python 类中“cls”和“self”之间的区别?

    Why is cls有时用来代替self作为 Python 类中的参数 例如 class Person def init self firstname lastname self firstname firstname self lastn
  • 在 java bigquery API 中使用标准 SQL 查询

    使用java bigquery API时是否可以使用标准SQL查询 我正在尝试执行查询 但它抛出 com google api client googleapis json GoogleJsonResponseException 400 错
  • 在状态恢复期间显示应用程序屏幕快照而不是启动屏幕

    我遇到了这种情况 我第一次将应用程序状态恢复 API 添加到支持 iOS 9 3 及更高版本的新应用程序中 状态恢复功能正常 但我注意到由于状态恢复期间的延迟 它显示的是屏幕快照而不是 LaunchScreen xib 内容 我所说的快照指