popgesture 是唯一能真正关闭 app 端侧滑返回的手势开关,ios 配置即生效且 onbackpress 不触发,android 需配合 onbackpress 拦截物理键并手动恢复 popgesture 防止后续失效。

popGesture 是唯一能真正关掉 App 端侧滑返回的手势开关,但它的行为在 iOS 和 Android 上完全不同,不能只配一个值就指望两边都生效。
pages.json 里配 popGesture 是最稳的入口
iOS 的侧滑是系统级行为,JS 层根本收不到事件,onBackPress 在 iOS 上压根不触发。想控制,只能从原生层关——而 pages.json 是 uni-app 提供的、最稳定且被官方文档确认的配置入口。
实测有效值只有两个:"close" 和 "none",其他如 "hide" 或大小写混用(如 "None")均无效。
-
"close":iOS 侧滑直接关闭当前 webview(等效调用uni.navigateBack()),安卓下表现接近默认行为 -
"none":彻底禁用侧滑,但注意——安卓设成这个后,物理返回键也会失效,必须额外加plus.key.addEventListener('backbutton')
页面级配置示例(仅对详情页生效):
{
"path": "pages/detail/detail",
"style": {
"app-plus": {
"popGesture": "none"
}
}
}
安卓必须配合 onBackPress 才算真正拦截
安卓平台所有返回动作(物理键、虚拟导航栏、侧滑手势)最终都会走到 onBackPress 生命周期钩子,但返回值决定是否拦截:
- 返回
true:表示“我拦住了”,原生返回逻辑终止 - 返回
false或不返回:放行,继续走原生回退流程 -
options.from可区分来源:"backbutton"(物理键/侧滑)或"navigateBack"(JS 主动调用)
典型写法(只拦物理返回和侧滑,放行 JS 调用):
onBackPress((options) => {
if (options.from === 'backbutton') {
return true;
}
return false;
})
弹窗场景必须运行时开关 popGesture
配置文件只能控制页面加载时的状态,弹窗出现/关闭这类动态场景,必须用 JS 实时控制 webview 样式,否则用户在弹窗里一划,直接退回上一页。
- 获取当前 webview 实例:
this.$mp.page.$getAppWebview()(Vue2/Vue3 均适用) - 弹窗打开时设
{ popGesture: 'none' },关闭时务必恢复为{ popGesture: 'close' } -
setStyle是异步操作,无回调,别依赖它立即生效;也不能只在 open 里关,漏掉 close 里的恢复,后续页面就再也侧滑不回去了
示例(弹窗组件内):
open() {
this.show = true;
//#ifdef APP-PLUS
let page = this.$mp.page.$getAppWebview();
page.setStyle({ popGesture: 'none' });
//#endif
}
close() {
this.show = false;
//#ifdef APP-PLUS
let page = this.$mp.page.$getAppWebview();
page.setStyle({ popGesture: 'close' });
//#endif
}
最容易被忽略的是:iOS 和 Android 对 popGesture 的响应机制完全不对等,iOS 配了就生效,Android 配了只是“关掉侧滑”,物理键还得靠 onBackPress 拦;而弹窗这种动态场景,不手动恢复 popGesture,整个 App 后续的侧滑返回就全废了。











