uni-app启动页不生效的主因是manifest.json中splashscreen未置于app-plus节点下;必须严格配置在app-plus内、大小写敏感、路径为static/相对路径,且iOS须用Storyboard而非纯图片。

启动页不生效?先确认 manifest.json 的 splashscreen 是否在 app-plus 下
90% 的“自定义启动页不显示”问题,根源是 splashscreen 字段写错了位置。它必须严格放在 manifest.json 的 app-plus 节点内,不能在根节点、h5 或 mp-weixin 下。大小写也敏感:splashscreen 不是 splashScreen。
正确结构示例:
"app-plus": {
"splashscreen": {
"alwaysShowBeforeRender": true,
"autoclose": false,
"waiting": true,
"android": {
"image": "static/splash/android.png"
},
"ios": {
"image": "static/splash/ios.png"
}
}
}
-
alwaysShowBeforeRender: true表示首页渲染完成前,启动页不会关闭;设为false则首页一加载完就关(易白屏) -
autoclose: false是手动控制的前提,否则plus.navigator.closeSplashscreen()无效 - 路径必须是
static/开头的相对路径,如"static/splash/android.png",不能带/或./ - iOS 真机和 App Store 审核要求使用
LaunchScreen.storyboard,纯image配置仅限调试,上线必换
想等接口返回再关启动页?别在 onLaunch 里调 closeSplashscreen
首页 onLoad 或 onShow 中调用 plus.navigator.closeSplashscreen() 才可靠。在 App.vue 的 onLaunch 里调,大概率失败——此时页面栈未就绪,plus 对象可能未初始化。
- 必须确保
manifest.json中splashscreen.autoclose和alwaysShowBeforeRender都为false,否则引擎会抢在你之前关掉 - 关闭时机建议放在 API 成功回调里,比如
uni.request({ success: () => plus.navigator.closeSplashscreen() }) - 加超时兜底:6 秒后强制关闭,避免用户卡在启动页(
setTimeout(() => plus.navigator.closeSplashscreen(), 6000)) - H5 平台不支持
plus.navigator,需条件编译:#ifdef APP-PLUS
iOS 启动页必须用 Storyboard,不是配个图就能过审
从 iOS 13 起,App Store 强制要求 Launch Screen 使用 LaunchScreen.storyboard,只填 splashscreen.ios.image 在真机上可能显示,但提交审核 100% 被拒。这不是 uni-app 的 bug,是苹果系统策略。
- uni-app 官方提供 Windows 可用的
LaunchScreen.storyboard模板(无需 Mac/Xcode),下载解压后放入unpackage/res/ios/ - 背景图命名必须规范:
dc_launchscreen_portrait_background@2x.png、@3x.png,尺寸按 iPhone X(1125×2436)设计 - storyboard 文件里可配置背景色、中间 logo、底部文字,全部通过 XML 修改,HBuilderX 可直接编辑
- 鸿蒙平台复用 Android 配置字段,不用单独填
harmony节点
启动逻辑 ≠ 启动页,别把首页跳转当“自定义启动”
uni-app 没有“运行时动态指定首个页面”的机制。所谓“改启动页”,本质只有两种方式:H5 用 pages.json 的 homePage(仅 H5 生效),其余平台必须把目标页面排在 pages.json 的 list 第一位。
-
homePage是 H5 专属,写成"homePage": "pages/login/login"有效;在 App 或小程序里写它,完全无效 - App 小程序换启动页,只能改
pages.json的list数组顺序,把新首页移到索引 0 - 不要在
main.js或App.vue里用uni.navigateTo跳转“模拟启动”,会导致白屏、路由栈错乱、onLoad不触发 - 冷启动参数(如分享链接、scheme)必须在首页
onLoad中用uni.getLaunchOptionsSync()读取,不能靠编译期硬编码
真正复杂的点在于:启动页(splash)是原生层控制的静态资源,而首页逻辑是 JS 层执行的动态过程,二者生命周期不同步。很多问题不是代码写错了,而是没分清哪部分该配 manifest、哪部分该写 Vue、哪部分必须走原生适配。











