双击退出应用仅在Android端可靠实现,需在App.vue中用onBackPress拦截返回键并结合时间戳判断:立即return true、2000ms阈值、this.lastBackTime挂载实例、非首页禁用;iOS提示手动退出,H5无法真正退出。
双击退出应用在 uni-app 中只能在 app 端(android)可靠实现,ios 不支持强制退出,h5 无法真正退出;核心是用 onbackpress 拦截物理返回键 + 时间戳判断间隔,且必须写在 app.vue 中全局生效。
onBackPress 必须在 App.vue 里写,不能放页面组件中
页面级的 onBackPress 只影响当前页,而“退出应用”是跨页面行为。用户从二级页返回首页后双击,逻辑必须还在——所以必须下沉到 App.vue 的生命周期里。
-
onBackPress在组件中声明无效,只在App.vue或 pages 下的页面 .vue 文件中生效 - 若写在某个业务页(如 pages/index/index.vue),切到其他页面后该逻辑就彻底失效
- App.vue 中需配合
options.from === 'backbutton'过滤,避免干扰uni.navigateBack()等 JS 调用
时间戳判断要立刻 return true,否则默认返回会先执行
这是最常踩的坑:onBackPress 函数入口不立即 return true,系统就会直接执行默认返回(比如跳上一页),弹窗都来不及显示。
- 正确顺序:先取
Date.now()→ 判断间隔 → 满足双击条件则调plus.runtime.quit()并return true;不满足则弹 toast 并return true - 错误写法:
if (res.confirm) { plus.runtime.quit(); }后再return true—— 用户还没点确认,页面已经退了 - 变量
this.lastBackTime必须挂载在App.vue实例上(data 或 export default 外层 this),不能是局部变量
2000ms 阈值 + setTimeout 清零,不能靠计数器
用时间戳比用计数器(如 this.clickCount++)更稳:避免用户连按三次导致状态错乱,也规避了清零时机难把握的问题。
- 阈值设为
2000是经验值,太短易误触,太长体验拖沓 - 清零必须用
setTimeout(() => { this.lastBackTime = 0; }, 2000),箭头函数确保this绑定正确 - 不能写成
setTimeout(function() { this.lastBackTime = 0; }, 2000),否则this指向 window,赋值失败 - 非首页(如子页、表单页)建议禁用该逻辑,否则用户无法正常后退;可用
getCurrentPages().length === 1判断是否在栈底
plus.runtime.quit() 仅 Android 有效,iOS 和 H5 要降级处理
iOS 审核禁止应用自行退出,plus.runtime.quit() 在 iOS 上静默失败;H5 的 window.close() 仅对 script 打开的窗口有效,普通页面打不开。
- Android:直接调
plus.runtime.quit() - iOS:改用
uni.showToast({ title: '双击 Home 键退出', icon: 'none' })提示用户手动操作 - H5:不触发
onBackPress,双击退出逻辑天然失效;如需类似体验,得用history.back()降级,但注意刷新后页面栈为空,会静默失败 - 鸿蒙平台需用 UTS 插件调
context.terminateSelf(),不能复用plus.runtime.quit()
真正麻烦的是多端一致性:你写的双击逻辑只在 App-Android 生效,其他平台要么没效果、要么要换 API、要么干脆不能做。别试图用一套代码覆盖所有场景,按平台条件编译(#ifdef APP-PLUS)+ 明确提示,比强行兼容更靠谱。


















