uni-app引导页需用vue页面手动实现,因原生splash无法执行js;通过uni.getstoragesync('launchflag')===true判断跳过,首次进入后设为true;白屏因splash关闭与页面渲染空档,需设"alwaysshowbeforerender":false、首帧图与splash一致;视频须muted、playsinline、x5-video-player-type="h5-page"且用绝对mp4路径;swiper应禁用autoplay、duration设320ms、circular为false。
uni-app 的 app 引导页不能靠“启动页配置”直接实现,必须用一个 vue 页面手动接管首次启动流程——原生 splash 是静态图,无法执行 js、无法控制跳转、更不能播视频或轮播。
怎么判断并跳过引导页
核心是用 uni.getStorageSync 同步读取标记,且必须显式比对 === true,避免字符串 "true" 或数字 1 误判:
-
uni.getStorageSync('launchFlag') === true→ 安全跳首页(推荐) -
uni.getStorageSync('launchFlag')→ 若存的是"false"或0,也会被当成 false,逻辑错乱 - 千万别用
uni.getStorage(异步),onLoad 里等回调会导致白屏或闪退 - 跳转后必须立刻调用
uni.setStorageSync('launchFlag', true),否则每次重启都进引导页
为什么引导页一打开就闪一下白屏
根本原因是原生 splash 关闭和 Vue 页面 mount 之间存在渲染空档,尤其在低端安卓机上可达 300ms+。单纯调大 splashscreen.delay 没用,反而延长启动时间。
- pages.json 中必须设
"alwaysShowBeforeRender": false,禁用 splash 等待首页渲染 - 把引导页设为 pages.json 的第一个页面路径(如
"path": "pages/guide/guide") - 引导页的
onLoad里立即执行videoContext?.play()或swiper.current = 0,加setTimeout(() => {}, 0)确保 DOM 就绪 - 首帧画面要和原生 splash 图(
splashscreen.image)完全一致,视觉上“无缝”
视频引导页必须加的三个属性
App 端 <video></video> 标签不加特定属性,90% 情况下会黑屏、跳原生播放器、或点一下才播:
-
muted:iOS/Android WebView 默认禁止有声自动播放,静音是硬性前提 -
playsinline:iOS 必须,否则强制全屏、页面中断、返回后白屏 -
x5-video-player-type="h5-page":安卓微信系 X5 内核必需,否则走 native player,无法控制、无法监听事件 - 视频路径必须用绝对路径:
/static/guide.mp4,不能用@/static/或相对路径 - 格式只用 MP4(H.264 + AAC),分辨率 ≤ 720p,码率 ≤ 1500kbps,否则首帧加载慢、黑屏久
swiper 轮播引导页容易卡顿的配置点
swiper 在 App 端不是纯 CSS 动画,各平台原生实现差异大,以下参数组合实测最稳:
-
autoplay设为false:引导页不该自动滑,用户主动操作才可靠 -
duration控制在300–320:太短生硬,太长拖沓,320ms 是多数机型手感平衡点 -
circular设为false:循环滑动在引导页无意义,还可能触发边界 bug -
display-multiple-items设为1:避免预加载多页导致内存抖动或图片错位 -
<image></image>必须设mode="aspectFill"且外层<swiper-item></swiper-item>有明确height,否则在某些安卓机上直接不渲染
最复杂的不是写代码,而是让「关闭 splash」和「Vue 页面第一帧渲染」在毫秒级时间窗口内对齐——这需要反复测不同机型、关掉所有无关插件、甚至手动插入 plus.navigator.closeSplashscreen() 来微调时机。











