You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Info.plist中‘Main storyboard file base name’的作用及保留必要性探讨

关于Info.plist中「Main storyboard file base name」配置的取舍分析

Info.plist中Main storyboard配置项截图

这个配置项并非必须存在,是否保留完全取决于你的项目启动逻辑、兼容需求和架构设计,下面具体说说两者的取舍原因:

保留该配置的理由

  • 兼容性覆盖:
    如果你需要支持iOS 12及更早版本,这个配置是必须的——iOS 13才引入SceneDelegate,旧系统完全依赖该配置自动加载主故事板完成启动流程,没有它会直接导致启动白屏。另外,保留它能适配Xcode默认模板的联动逻辑,比如在Interface Builder里修改初始控制器时,系统会自动同步这个配置,不用手动改代码。
  • 微幅性能优势:
    系统通过配置项加载故事板是原生优化的流程,比手动在代码里实例化少了一层调用逻辑,理论上启动速度会略快(虽然差异极小,普通项目基本感知不到)。
  • 简化启动代码:
    对于单故事板的简单项目,保留配置就不用在SceneDelegate/AppDelegate里写额外的界面初始化代码,启动逻辑完全由系统托管,减少代码量。

删除该配置的理由

  • 支持自定义启动流程:
    当你需要根据业务逻辑动态跳转启动界面时(比如判断用户是否登录,决定加载首页还是登录页),必须删掉这个配置——否则系统会优先自动加载主故事板,导致你的自定义逻辑失效,甚至出现界面加载冲突。
  • 适配多故事板架构:
    如果项目采用多故事板拆分模块的设计,手动实例化指定故事板的控制器更灵活,能精准控制界面加载顺序和模块跳转,避免系统默认加载带来的不确定性。
  • 提升代码可控性:
    删除配置后,启动阶段的界面加载逻辑完全由代码掌控,所有步骤清晰可见,便于调试和维护,尤其适合复杂项目的迭代开发。

如果决定删除该配置,需要手动在代码中完成根视图控制器的设置,示例代码如下:

// iOS 13+ 在SceneDelegate中实现
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    guard let windowScene = scene as? UIWindowScene else { return }
    let window = UIWindow(windowScene: windowScene)
    // 手动加载指定故事板并设置根控制器
    let mainStoryboard = UIStoryboard(name: "Main", bundle: Bundle.main)
    window.rootViewController = mainStoryboard.instantiateInitialViewController()
    window.makeKeyAndVisible()
    self.window = window
}

内容的提问来源于stack exchange,提问作者Jake Chasan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 07:05:14