manifest.json 是 ios 端最稳起点,需协同配置 app-plus.safearea.background(主色调)和 bottom.offset(多选 "auto"),并配 viewport-fit=cover 与 @supports 包裹 env(safe-area-inset-bottom) 回退写法。

直接改 manifest.json 是 iOS 端最稳的起点,不需要写 JS、不依赖运行时判断,改完重新运行就生效。其他方案要么 fallback 不全,要么只覆盖部分场景。
manifest.json 配置 background + offset 才算完整
只设 offset: "auto" 或只设 background 都会出白条或色差。必须协同设置:
-
app-plus.safearea.background填你 App 主色调(比如深色主题用"#1A1A1A"),别留默认"#FFFFFF",否则 iPhone 上必出白条 -
app-plus.safearea.bottom.offset大多数页面选"auto",它会让原生层自动上推内容,并用background填满底部空白 - 改完必须执行
npm run dev或点击 HBuilderX 的“运行到手机”,热更新不触发 manifest 重载
CSS 里用 env(safe-area-inset-bottom) 必须带 fallback
纯靠 env(safe-area-inset-bottom) 在 iOS 11.2 及更早版本会失效,H5 和支付宝小程序则完全不支持。安全写法是:
- 先写
padding-bottom: constant(safe-area-inset-bottom)(iOS ≤ 11.2) - 再写
padding-bottom: env(safe-area-inset-bottom)(iOS ≥ 11.3)——顺序不能反,否则旧版无回退 - 整段必须包在
@supports (padding-bottom: env(safe-area-inset-bottom))里,否则某些安卓 WebView 会直接丢弃整条规则 - viewport 必须加
viewport-fit=cover,否则env()根本不触发
offset: "none" 不是“关掉安全区”,而是“交给你自己兜底”
设成 "none" 后系统不再占位,但你的布局必须立刻补上等高 padding 或调整绝对定位元素的 bottom 值,否则按钮直接消失。常见漏点:
- 只加了
padding-bottom,没同步改position: absolute元素的bottom,导致定位错乱 - 滚动容器(如
scroll-view)的height没减去安全区高度,内容被截断 - 真机上
screenHeight - windowHeight差值 > 60px 时,大概率存在不可见导航栏,光靠safeArea.bottom不准,得结合差值估算 - 仅适合全屏视频页,且必须配
navigationStyle: "custom"和titleNView: false
u-safe-bottom 组件只在 APP 端生效,别和 manifest.auto 冲突
u-safe-bottom 是 uView 提供的兜底组件,但它有明确边界:
- 仅对 APP 端生效,H5 / 小程序需另配 CSS fallback
- 如果
manifest.json里已设offset: "auto",再用u-safe-bottom会导致底部双倍空白 - 它内部用的是
uni.getSystemInfoSync().safeArea.bottom,首次渲染可能取不到值,建议在onLoad或onShow中动态赋值 - H5 端完全不支持
safeArea字段,得硬编码 fallback(比如 iOS 设备设safeBottom = 34)
最易忽略的其实是 viewport-fit=cover 和 @supports 的组合——缺一不可,否则 env() 在很多机型上压根不生效,连 fallback 都进不去。











