iOS应用启用状态恢复失效:Storyboard配置后恢复时跳回初始Tab
排查步骤
- 适配Scene模式下的状态恢复入口
从iOS13开始,默认开启多Scene支持的项目,状态保存、恢复的逻辑全部从AppDelegate迁移到SceneDelegate处理。你在AppDelegate中实现的shouldSaveSecureApplicationState、shouldRestoreSecureApplicationState方法,在启用Scene的项目中不会被系统触发,直接导致后续encodeRestorableState、decodeRestorableState方法完全不会被调用。
需要将对应代理方法迁移到SceneDelegate中:// SceneDelegate 内的正确实现 func scene(_ scene: UIScene, shouldSaveSecureState coder: NSCoder) -> Bool { return true } func scene(_ scene: UIScene, shouldRestoreSecureState coder: NSCoder) -> Bool { return true } - 检查Storyboard restoration 配置链路完整性
Storyboard的状态恢复是沿控制器链路递归校验的,只要链路任意节点缺少restoration identifier,整个恢复流程就会中断。
需要确认以下配置无遗漏:- 根TabBarController本身的Restoration ID已填写(很多开发者只会给子页面VC设置ID,漏掉根控制器)
- 所有嵌入在TabBar下的导航控制器、子页面VC的Restoration ID唯一且非空
- 不存在重复的Restoration ID值,否则会导致实例创建混乱
- 修正状态恢复的测试流程
通过Xcode Run按钮启动应用、或在调试状态下退出应用,系统会自动清除上一次的状态恢复缓存,导致测试结果失效。
正确的测试流程:- 从设备/模拟器桌面点击图标启动应用,切换Tab到非首页状态
- 按Home键退到后台,等待3秒以上让系统完成状态持久化写入
- 从系统后台任务列表上滑关闭应用
- 从设备/模拟器桌面重新点击图标启动应用,全程不通过Xcode调试入口触发
- 修正TabBar选中项的恢复冲突
自定义的TabBar选中项编解码逻辑本身符合规范,出现“短暂显示之前选中的Tab、随后跳回首页”的现象,通常是被控制器的默认选中逻辑覆盖导致的:viewDidLoad方法的执行时机早于decodeRestorableState的执行回调,如果在viewDidLoad中硬编码设置selectedIndex = 0,会直接把恢复的选中值覆盖为默认首页。需要增加空值判断:仅当没有从缓存中读取到已保存的选中索引时,才设置默认选中第一个Tab。
内容的提问来源于stack exchange,提问作者Indiana Kernick
相关产品推荐
相关产品推荐

