 
            【PWA】判断当前页面是由PWA启动的
在 PWA 中,可以通过检查页面是否由 PWA 启动来实现特定功能(例如隐藏导航栏或显示不同的 UI)。以下是常见的方法来判断页面是否由 PWA 启动:
方法 1:使用 window.matchMedia
通过检测 display-mode 来判断页面启动方式。
示例代码:
if (window.matchMedia('(display-mode: standalone)').matches) {
  console.log('当前页面是以 PWA 模式启动的');
} else {
  console.log('当前页面是以浏览器模式启动的');
}
- 解释:
- standalone表示以 PWA 模式启动。
- 其他可能的模式:
- fullscreen:全屏启动。
- minimal-ui:最小 UI 模式。
- 默认是 browser,表示在普通浏览器中运行。
 
 
方法 2:检查 navigator.standalone
对于 iOS 设备,可以使用 navigator.standalone 属性。
示例代码:
if (window.navigator.standalone) {
  console.log('当前页面是以 PWA 模式启动的 (iOS)');
} else {
  console.log('当前页面是以浏览器模式启动的 (iOS)');
}
- 解释:
- navigator.standalone是 iOS Safari 的特有属性,返回- true表示当前页面是以 PWA 模式启动。
 
方法 3:检测 window.location.referrer
通过检测 referrer,可以间接判断是否由某些 PWA 环境触发。
示例代码:
if (document.referrer === '') {
  console.log('当前页面可能是直接由 PWA 启动的');
} else {
  console.log('当前页面是从其他页面跳转来的');
}
- 解释:
- 如果 referrer为空且同时满足其他条件,可能是从主屏幕启动的。
 
- 如果 
方法 4:在 Service Worker 中传递状态
可以通过 Service Worker 为页面添加标记来标识启动来源。
示例代码:
- 
在 Service Worker 中传递标记: self.addEventListener('fetch', (event) => { const url = new URL(event.request.url); if (url.pathname === '/') { const modifiedRequest = new Request(event.request, { headers: new Headers({ ...event.request.headers, 'X-PWA-Start': 'true', }), }); event.respondWith(fetch(modifiedRequest)); } });
- 
在页面中读取标记: fetch('/') .then((response) => { if (response.headers.get('X-PWA-Start') === 'true') { console.log('当前页面是通过 PWA 启动的'); } });
方法 5:结合 URL 参数
如果 PWA 应用的入口是通过 start_url 指定的,可以在 manifest.json 的 start_url 中添加特定的参数来标识启动来源。
修改 manifest.json:
{
  "start_url": "/?pwa=true",
  "display": "standalone",
  ...
}
在页面中检查参数:
const urlParams = new URLSearchParams(window.location.search);
if (urlParams.get('pwa') === 'true') {
  console.log('当前页面是以 PWA 模式启动的');
}
方法 6:综合检测
在实际项目中,可以结合以上多种方法来提高判断的准确性:
function isPWAMode() {
  const isStandalone =
    window.matchMedia('(display-mode: standalone)').matches || window.navigator.standalone;
  const hasPWATag = document.referrer === '' || new URLSearchParams(window.location.search).has('pwa');
  return isStandalone || hasPWATag;
}
if (isPWAMode()) {
  console.log('当前页面是以 PWA 模式启动的');
} else {
  console.log('当前页面是以浏览器模式启动的');
}
总结
以上方法可以单独使用,也可以结合起来提高判断准确性。
一般情况下,使用 window.matchMedia 是最推荐的方法,因为它直接针对 PWA 的显示模式。对于更复杂的应用场景,可以结合 Service Worker 和 URL 参数。
- 感谢你赐予我前进的力量
                                
                                
                                    
赞赏者名单
                                    因为你们的支持让我意识到写文章的价值🙏
                                
                            
            本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 时光·李记
        
     评论
            
                匿名评论
                隐私政策
            
            
                你无需删除空行,直接评论以获取最佳展示效果
            
         
            
        

