iPad主屏幕Web应用跳转页面时Safari出现扩展导航栏如何移除
问题描述
现有一款可被用户添加到iPad主屏幕、以独立应用形式运行的Web应用。
为了让该应用在iPad上运行时UI尽可能精简,我们添加了如下meta标签:
<meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
应用初始加载时符合预期,仅显示极简的UI界面(极简浏览器边框),但当用户跳转到新页面时,即使没有历史浏览记录,Safari的前进/后退按钮也会出现,顶部同时出现灰色扩展浏览器边框。
该应用为NextJS项目,使用框架内置的路由能力,请问有什么方法可以阻止Safari显示扩展状态栏?
解决方案
- 统一使用Next.js内置客户端路由能力
所有内部页面跳转统一使用<Link>组件或router.push/router.replace方法,不要使用原生<a>标签做当前页跳转,避免触发页面刷新,Safari不会将客户端路由跳转识别为跨页面导航,就不会触发导航栏显示。外部链接统一使用window.open新开窗口打开,不要占用当前页的导航栈。 - 优化历史栈逻辑
非必要不需要留存历史记录的跳转,统一使用router.replace替代router.push,减少历史栈堆积,历史栈为空时Safari没有可显示的前进/后退操作入口,自然不会弹出扩展状态栏。 - 补充完整PWA配置
除已添加的meta标签外,补充配置manifest.json文件,设置"display": "standalone"、"fullscreen": true、"display_override": ["standalone", "fullscreen"],苹果系统会优先读取manifest配置,识别应用为完整独立Web应用,不会额外注入导航栏。同时补充viewport meta标签:
适配设备安全区域,避免出现异常灰色色块。<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> - 避免服务端重定向
尽量不要在getServerSideProps、getInitialProps或服务端组件中直接做页面重定向,服务端重定向会触发页面刷新,产生新的历史记录,触发导航栏显示,必要的重定向逻辑移到客户端执行。 - 适配顶部安全区域
添加全局CSS样式适配状态栏高度,即使出现特殊情况显示了状态栏,也不会遮挡页面内容::root { padding-top: env(safe-area-inset-top); }
内容的提问来源于stack exchange,提问作者joeyfb
相关产品推荐
相关产品推荐

