pages.json 是 ios 侧滑返回唯一可靠配置入口,仅支持 "close" 和 "none";安卓需配合 onbackpress 拦截,弹窗场景须用 setstyle 动态控制,全局禁用应改 manifest.json 的 app-plus 节点。

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
const wv = this.$mp.page.$getAppWebview();
wv.setStyle({ popGesture: 'none' });
//#endif
},
close() {
this.show = false;
//#ifdef APP-PLUS
const wv = this.$mp.page.$getAppWebview();
wv.setStyle({ popGesture: 'close' });
//#endif
}
全局禁用要改 manifest.json,不是 pages.json
很多人误把全局配置写在 pages.json 里,结果只影响新打开的页面,已加载的页面完全不受控。真正全局生效的位置是 manifest.json 中的 app-plus 节点:
"app-plus": {
"popGesture": "none"
}
注意:manifest.json 修改后需重新编译 App 才能生效,H5 和小程序端完全不受影响——这个配置只作用于 App-Plus 环境。
最易忽略的一点:iOS 的侧滑区域严格限定在屏幕左侧边缘约 20–30px,但一旦设为 "none",整个屏幕左右滑动都无效;而安卓侧滑范围更宽,且与物理键共用同一拦截通道,所以两端必须分开处理,不能只靠一个配置打天下。











