app端开屏资源必须在打包阶段注入,不能用运行时js替换,否则ios审核拒审、android白屏或闪退;因开屏由原生层控制,js尚未执行,需通过构建脚本替换manifest.json及资源文件实现客户化定制。

App端开屏资源(图标、启动图、隐私协议)不能靠运行时JS替换,必须在打包阶段注入——否则iOS审核会拒审,Android也会白屏或闪退。
为什么不能用uni.setStorageSync + onLaunch动态换启动图
因为App端的开屏(splashscreen)由原生层控制,Vue实例甚至还没初始化,JS根本没机会执行。iOS要求启动图必须是编译时确定的静态资源,且尺寸/命名/路径严格匹配平台规范;Android虽稍宽松,但plus.navigator.closeSplashscreen()触发前,JS无法修改原生层已加载的图片资源。常见错误现象包括:启动图始终是默认图、切换主题后启动图不变、iOS审核提示“启动画面与应用内容不一致”。
正确做法:CLI打包时用脚本注入客户专属资源包
核心是把资源替换逻辑前置到vue.config.js或自定义构建脚本中,而非运行时。关键步骤:
- 在项目根目录建
config/文件夹,按客户分目录存放icons/、splash/、androidprivacy.json等 - 修改
manifest.json中的app-plus.splashscreen.image路径为占位符,如__SPLASH_IMAGE__ - 编写Node脚本,在
npm run build:app-plus前读取指定客户配置,批量替换manifest.json字段,并拷贝对应splash/下的图片到unpackage/res/splash/ - 图标替换同理:将
manifest.json中icons数组里的src字段指向客户目录下的app_icon.png,再用fs.copyFileSync覆盖unpackage/res/icons/
隐私协议文本必须走uni.getPrivacyAuthorization + 静态JSON注入
App端隐私协议不是HTML页面,而是原生弹窗,协议内容必须提前写入androidprivacy.json或iosprivacy.json,并在manifest.json中通过permissions节点引用。运行时调用uni.getPrivacyAuthorization只是触发弹窗,内容完全取决于打包时注入的JSON文件。容易踩的坑:
- JSON字段名必须严格为
title、content、confirmText,多一个空格都导致弹窗空白 - iOS要求
content里不能含HTML标签,Android允许但建议纯文本 - 协议更新后必须重新打包,
uni.getPrivacyAuthorization不会从网络拉取新内容
动态加载启动页内容?只能做“伪动态”
真正的开屏图无法动态换,但可以在关闭原生启动图后、首页渲染前,用uni.showLoading或自定义骨架屏模拟“第二段启动”。这时才能安全执行JS逻辑:
- 在
App.vue的onLaunch里调用plus.navigator.closeSplashscreen()(注意:需配合manifest.json中alwaysShowBeforeRender: false) - 紧接着
uni.preloadPage预加载首页,同时用uni.downloadFile拉取客户专属的启动文案或小动画资源 - 首页
onLoad中检查下载结果,失败则 fallback 到默认文案——这才是唯一能动态干预的环节
真正需要动态变的,从来不是那张静态图,而是用户看到第一屏内容前的过渡体验。把精力放在这个环节,比硬刚原生启动图更可控、更合规。











