Info.plist中‘Main storyboard file base name’的作用及保留必要性探讨
关于Info.plist中「Main storyboard file base name」配置的取舍分析

这个配置项并非必须存在,是否保留完全取决于你的项目启动逻辑、兼容需求和架构设计,下面具体说说两者的取舍原因:
保留该配置的理由
- 兼容性覆盖:
如果你需要支持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
相关产品推荐
相关产品推荐

