图标和启动页必须通过 manifest.json 配置,ios 强制 storyboard、鸿蒙复用 android 字段、android 需多密度图;不合规将导致变形、白屏或被 app store 拒绝。

直接说结论:图标和启动页必须通过 manifest.json 配置,且不同平台规则差异极大——iOS 强制要求 Storyboard,鸿蒙复用 Android 字段,Android 需多密度图;不按规范配,真机上要么变形、要么白屏、要么被 App Store 拒绝。
manifest.json 中 icons 配置的平台差异
图标不是放一张 1024×1024 就完事。各平台读取路径、尺寸、命名逻辑完全不同:
- iOS 必须提供
appstore(1024×1024)、iphone下的2x(120×120)和3x(180×180)三档,缺一不可;HBuilderX 可视化界面会自动补全,但源码里必须显式写出 - Android 使用
mdpi/hdpi/xhdpi/xxhdpi等密度字段,对应 48×48 / 72×72 / 96×96 / 144×144;鸿蒙系统直接读取android节点,推荐用 192×192 的xxxhdpi - 所有路径都必须是项目内相对路径,如
static/icons/icon-120.png;不能用网络地址,也不能漏掉static/前缀 - 图标文件本身要无透明边框、无圆角(iOS 会自动加),PNG 格式,Alpha 通道干净——否则某些安卓机型渲染时边缘发灰
splashscreen 配置为什么 iOS 和 Android 不能共用一套图
因为底层机制完全不同:
- iOS 自 2020 年起已禁用静态启动图(Launch Images),只认
.storyboard;若在splashscreen.ios下配image字段,云打包会静默忽略,真机运行就是纯白屏或默认灰色背景 - Android 和鸿蒙支持
image字段,但必须为多尺寸 PNG:常见有hdpi(480×800)、xhdpi(720×1280)、xxhdpi(1080×1920);单图拉伸会导致文字模糊、Logo 变形 -
alwaysShowBeforeRender: true是防白屏关键开关——它让启动页坚持到 Vue 页面首次渲染完成才关闭;设为false或不写,首页 JS 还没加载完启动页就消失,必闪白 - 启动页图片建议用与首页
background完全一致的颜色或渐变,视觉上能“无缝衔接”,比堆动画更有效
打包前必须验证的三个硬性条件
很多问题不是配置错,而是打包环节漏了检查:
- 图标和启动图文件必须真实存在于
static/目录下,且文件名与manifest.json中写的**完全一致**(大小写、扩展名、@2x 后缀都不能错) - iOS Storyboard 打包需额外准备 ZIP 包:根目录必须含
LaunchScreen.storyboard+launchimage@2x.png+launchimage@3x.png;ZIP 内不能有文件夹嵌套,否则 HBuilderX 解压失败 - 改完
manifest.json后,必须重新执行「发行 → 原生 App-云打包」,本地调试(运行到手机)不会生效;HBuilderX 缓存有时不刷新,可删掉项目根目录下unpackage/文件夹再试
最常被忽略的一点:启动页不是越炫越好。iOS 审核明确反对在 Launch Screen 里放动态内容、进度条、品牌 slogan;它只应展示静态 Logo 和基础色块。而 Android 端过度依赖 JS 插件(如 uni-app-plus-splashscreen)接管启动流程,反而增加首屏延迟——原生配置才是稳定底线。











