Launch Screen仅显示一次求助:如何实现每次启动均展示启动页
解决LaunchScreen.storyboard仅首次显示的问题
嘿,这个问题其实是iOS系统的默认机制在搞鬼~系统为了让应用启动看起来更快,会缓存LaunchScreen的快照,所以你杀掉后台再启动时,系统直接拿出缓存的快照展示,不会重新加载LaunchScreen.storyboard,这就是为什么只有首次安装才会看到真正的启动页。
下面给你两种可行的解决办法,按需选择:
调试阶段快速验证:手动清除快照缓存
如果你只是在开发调试时想反复查看启动页效果,最简单的方式就是:- 从Xcode里卸载应用后重新安装(不是点运行,而是先删再装)
- 或者在iPhone的「设置」→「通用」→「iPhone存储空间」里找到你的应用,删除后再重新安装。不过这个方法只适合自己调试,普通用户没法这么操作哦。
正式方案:自定义启动页逻辑(用户每次启动都能看到)
这是市面上多数App采用的合规方式——自己做一个和LaunchScreen视觉完全一致的ViewController,在App启动时先展示它,延迟几秒再跳转到主界面。具体步骤:- 创建新的ViewController(比如命名为
SplashViewController),把LaunchScreen里的所有布局、元素原封不动复制过来,保证和系统启动页看起来一模一样。 - 根据你的项目架构设置根视图:
- 如果用的是
AppDelegate(iOS 12及以下,或未启用Scene的项目),在application(_:didFinishLaunchingWithOptions:)里添加代码:func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { window = UIWindow(frame: UIScreen.main.bounds) // 先展示自定义启动页 let splashVC = SplashViewController() window?.rootViewController = splashVC window?.makeKeyAndVisible() // 延迟2秒跳转到主界面,时间可以自己调整 DispatchQueue.main.asyncAfter(deadline: .now() + 2) { // 替换成你的主页面ViewController let mainVC = YourMainViewController() // 如果需要导航栏,就包一层UINavigationController self.window?.rootViewController = UINavigationController(rootViewController: mainVC) } return true } - 如果用的是
SceneDelegate(iOS 13+),就在scene(_:willConnectTo:options:)方法里做同样的操作。
- 如果用的是
- 别忘了保留原来的LaunchScreen.storyboard!iOS系统在应用安装、更新等场景还是需要它的,我们只是在日常启动时用自定义VC替代展示而已。
- 创建新的ViewController(比如命名为
重要提醒
千万别尝试去修改系统的快照缓存机制,苹果没有开放相关接口,强行操作不仅可能导致App审核不通过,还可能引发各种不可预料的问题,自定义启动页是最稳妥的合规方案。
内容的提问来源于stack exchange,提问作者Arnav GUPTA




