You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Launch Screen仅显示一次求助:如何实现每次启动均展示启动页

解决LaunchScreen.storyboard仅首次显示的问题

嘿,这个问题其实是iOS系统的默认机制在搞鬼~系统为了让应用启动看起来更快,会缓存LaunchScreen的快照,所以你杀掉后台再启动时,系统直接拿出缓存的快照展示,不会重新加载LaunchScreen.storyboard,这就是为什么只有首次安装才会看到真正的启动页。

下面给你两种可行的解决办法,按需选择:

  • 调试阶段快速验证:手动清除快照缓存
    如果你只是在开发调试时想反复查看启动页效果,最简单的方式就是:

    • 从Xcode里卸载应用后重新安装(不是点运行,而是先删再装)
    • 或者在iPhone的「设置」→「通用」→「iPhone存储空间」里找到你的应用,删除后再重新安装。不过这个方法只适合自己调试,普通用户没法这么操作哦。
  • 正式方案:自定义启动页逻辑(用户每次启动都能看到)
    这是市面上多数App采用的合规方式——自己做一个和LaunchScreen视觉完全一致的ViewController,在App启动时先展示它,延迟几秒再跳转到主界面。具体步骤:

    1. 创建新的ViewController(比如命名为SplashViewController),把LaunchScreen里的所有布局、元素原封不动复制过来,保证和系统启动页看起来一模一样。
    2. 根据你的项目架构设置根视图:
      • 如果用的是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:)方法里做同样的操作。
    3. 别忘了保留原来的LaunchScreen.storyboard!iOS系统在应用安装、更新等场景还是需要它的,我们只是在日常启动时用自定义VC替代展示而已。
  • 重要提醒
    千万别尝试去修改系统的快照缓存机制,苹果没有开放相关接口,强行操作不仅可能导致App审核不通过,还可能引发各种不可预料的问题,自定义启动页是最稳妥的合规方案。

内容的提问来源于stack exchange,提问作者Arnav GUPTA

火山引擎 最新活动