不会直接影响,但误用 uni.showTabBar/uni.hideTabBar 会导致广告页“闪一下就没了”;开屏页须为 pages.json 中 list 的首个非 tabBar 页面,且广告页中不可调用 showTabBar,需跳转至主页面后显式调用。

uni-app 的 uni.showTabBar 和 uni.hideTabBar 会影响开屏页显示吗?
不会直接影响,但容易误用导致广告页“闪一下就没了”。开屏页必须是首个加载的页面(即 pages.json 中 "list" 的第一个页面),且不能依赖 tabbar 页面作为入口。很多开发者把广告页放在 tabBar 页面里,或在首页 onLoad 里调用 uni.showTabBar,结果广告还没展示完 tabbar 就弹出来了,视觉上就是跳过广告。
正确做法是:广告页设为非 tabBar 页面,且在 pages.json 的 "list" 顶部;广告页生命周期内不调用 uni.showTabBar,等跳转到主页面(比如首页)后再显式调用。
- 广告页的
style配置中务必加"navigationStyle": "custom",避免原生导航栏遮挡 - App 启动时默认会显示 splash 图(iOS 启动图、Android 启动白屏),这和广告页是两回事——前者是原生层,后者是 webview 层,别混淆
- 真机调试时,iOS 上广告页可能因 webview 初始化延迟出现“黑屏→白屏→广告”三段式,建议在
onLoad里用setTimeout延迟 100ms 再开始倒计时,给渲染留缓冲
如何在广告页实现「3秒倒计时跳转 + 点击跳过」逻辑?
核心是控制跳转时机,同时兼顾用户主动交互。不能只靠 setTimeout,否则用户点“跳过”时可能已触发跳转,造成重复路由或白屏。
推荐写法:用一个布尔变量 isJumping 锁定跳转状态,并在倒计时结束和点击事件中统一处理:
export default {
data() {
return {
countdown: 3,
isJumping: false
}
},
onLoad() {
this.startCountdown()
},
methods: {
startCountdown() {
const timer = setInterval(() => {
if (this.countdown <= 1) {
clearInterval(timer)
this.jumpToHome()
} else {
this.countdown--
}
}, 1000)
},
jumpToHome() {
if (this.isJumping) return
this.isJumping = true
uni.navigateTo({
url: '/pages/index/index',
success: () => {
// 主页面里再 showTabBar
}
})
},
skip() {
if (this.isJumping) return
this.isJumping = true
this.jumpToHome()
}
}
}- 倒计时数值建议从 3 开始,避免用户误判“还有 4 秒”,实际只剩 3 秒可点
- 不要在
onUnload或onHide里清理定时器——广告页不会触发这些生命周期,clearInterval必须在倒计时结束前显式调用 - Android 真机上,若跳转后首页白屏,大概率是首页用了
uni.getSystemInfoSync().platform === 'android'做条件渲染但没兜底,检查首页的 data 初始化是否完整
App.vue 的 onLaunch 能不能直接跳转到广告页?
不能。uni-app 的 onLaunch 是应用级生命周期,此时页面栈为空,但 uni.navigateTo 等路由 API 尚未就绪,调用会静默失败(HBuilderX 控制台无报错,但无反应)。
必须让框架先加载第一个页面,再由该页面发起后续跳转。所以广告页必须是 pages.json 中配置的第一个页面,而不是靠 onLaunch “抢跑”。
- 如果项目原本首页是 tabBar 页面,又想加广告页,需将广告页提到
pages.json的"list"顶部,并确保其"path"不在"tabBar"的"list"里 - 某些插件(如
uni-ad)会自动注入启动逻辑,若启用,需确认它是否覆盖了你的广告页跳转,优先关掉插件自启,自己控制 - iOS 打包后首次安装启动慢,广告页倒计时建议设为 3.5 秒而非 3 秒,留出 webview 加载余量
广告页图片资源怎么放才不白屏、不拉伸?
图片路径必须用绝对路径(/static/splash.png),且尺寸按平台要求预裁剪。uni-app 不会自动缩放或居中处理 <image></image>,全靠 CSS 控制,稍有偏差就会白屏或变形。
关键 CSS 设置:
<image class="ad-img" :src="'/static/splash.png'" />
<p>.ad-img {
width: 100%;
height: 100vh;
object-fit: cover; /<em> 关键:不拉伸,只裁切 </em>/
position: absolute;
top: 0;
left: 0;
}- Android 建议提供 1080×1920 和 720×1280 两套图,放在
/static/下,用uni.getSystemInfoSync().screenHeight动态选图(但注意:首屏渲染时可能拿不到准确值,稳妥做法是打包时按主流分辨率统一裁成 1080×1920) - iOS 启动图(LaunchImage)和广告页是分开的:前者是 native 层静态图,后者是 webview 渲染,两者尺寸不必一致,但视觉风格要连贯
- 不要用 background-image 设置广告图——
<image></image>可监听load事件,background-image不行,无法做“图加载完成才开始倒计时”的优化
最常被忽略的是:Android 打包后 /static/ 下的图片若带中文名或空格,会 404,必须用英文+下划线命名,且构建前手动检查路径是否被 HBuilderX 自动转义。


















