uni-app开屏广告需禁用启动页自动关闭,配置manifest.json中app-plus的autoclose:false;广告展示必须在app.vue的onlaunch中用settimeout或sdk回调控制时长(≥3秒),先调uni.hidelaunchscreen再uni.relaunch跳转,登录态仅读本地缓存,避免网络请求阻塞。

uni-app 启动页不自动关闭,才能加开屏广告
uni-app 默认会等首页渲染完就关启动页,根本没机会展示广告。必须手动禁用自动关闭,否则 uni.hideLaunchScreen 调用无效或被忽略。
关键配置在 manifest.json 的 app-plus 节点下:
-
"autoclose": false—— 强制禁止自动关闭 -
"alwaysShowBeforeRender": false—— 避免首页白屏时还卡着启动图 -
"waiting": false—— 关掉加载动画,让广告自己控制显隐
注意:H5 和小程序平台不走这套逻辑,该配置仅对 App(iOS/Android)生效。
开屏广告展示后跳转,不能直接用 uni.navigateTo
启动页(splash screen)不是普通页面,它没有 Vue 实例、不挂载 DOM、也不走 onLoad 生命周期。所有跳转操作必须在 app.vue 的 onLaunch 中完成,且要等广告展示结束再触发。
常见错误是:广告倒计时还没完就调了 uni.reLaunch,导致广告一闪而过;或者用了 uni.navigateTo,结果跳转失败并报错 “page not found” —— 因为启动页期间页面栈尚未初始化完整。
正确做法是:
- 用
setTimeout或广告 SDK 的回调控制展示时长(建议 ≥ 3 秒) - 先调
uni.hideLaunchScreen()隐藏启动页(成功后才可跳转) - 再用
uni.reLaunch或uni.redirectTo跳转目标页(不能用navigateTo)
示例逻辑:
onLaunch() {
// 展示 3.5 秒广告
setTimeout(() => {
uni.hideLaunchScreen({
success: () => {
// 登录态检测可放这里,或提前做
const token = uni.getStorageSync('token');
const target = token ? '/pages/home/index' : '/pages/login/index';
uni.reLaunch({ url: target });
}
});
}, 3500);
}
App 启动页跳转前必须检测登录态,但别在广告期间发请求
用户打开 App 时,你既想展示广告,又想判断是否已登录、该跳首页还是登录页。但千万别在 onLaunch 里直接发起网络请求(比如调 uni.request 验证 token 有效性),因为广告倒计时和网络延迟不可控,容易造成白屏卡顿或跳转错乱。
推荐策略是「本地缓存 + 延迟校验」:
- 只读
uni.getStorageSync('token')判断是否存在(同步、毫秒级) - 跳转后,在目标页(如首页)的
onShow或onLoad中再发起 token 刷新或有效性验证 - 如果验证失败,再
uni.reLaunch回登录页 —— 这样广告不卡,体验更稳
特别注意:uni.getStorageSync 只能读本地存储,无法替代服务端鉴权。它只是快速分流,不是安全校验。
安卓和 iOS 对启动页时长限制不同,3 秒是安全底线
苹果 App Store 明确要求开屏广告 ≤ 3 秒,超时会被拒审;华为、小米等安卓渠道也普遍要求 ≤ 5 秒。硬写 10 秒倒计时看似“保险”,实则埋雷。
实操建议:
- 广告展示固定 3 秒,不依赖图片加载完成时间(避免因 CDN 慢导致超时)
- 加「跳过」按钮,点击立即执行
uni.hideLaunchScreen+ 跳转 - 跳过按钮需在倒计时 ≥ 1 秒后才可点击,符合平台规范
最后提醒:uni.hideLaunchScreen 在某些低端安卓机上可能失败(返回 fail),务必补 fail 回调里的兜底跳转,否则用户会长时间卡在黑屏或白屏。











