判断用户是否在pwa环境中打开运行?(已安装的 PWA 与未安装的 PWA 网站之间有什么区别?)

news/2024/10/18 19:28:46/

前言:

👉vue3+ts+vite项目中使用vite-plugin-pwa搭建 PWA 项目,以及如何处理pwa安装图标的显示隐藏
👉pwa在iframe下能否显示,以及在iframe下相关问题解析

pwa_3">如何判断用户是否在pwa环境中运行?

  1. pwadisplaymode_5">根据pwa配置的display-mode

这个display-mode配置,在前言的文章中有说到,需要配置的参数。

const displayModes = ['fullscreen', 'standalone', 'minimal-ui']
const matchesPwa = displayModes.some(displayMode => window.matchMedia('(display-mode: ' + displayMode + ')').matches
)
  1. 对于IOS, 使用 navigator.standalone 属性:

iOS 设备上,如果 PWA 已通过 Safari 添加到主屏幕,navigator.standalone 属性将返回 true,否则返回 false

  1. 对于Android, 检查用户document.referrer 中是否包含字符串 'android-app://'

document.referrer.includes('android-app://')

document.referrer 是一个字符串,表示当前文档的来源 URL(即用户是从哪个页面链接过来的)。

includes('android-app://') 是用于检查 document.referrer 中是否包含字符串 'android-app://'。

这段代码的作用是检查用户是否是通过 Android 应用进入当前网页的。如果是,这段代码会返回 true,否则返回 false

最后代码:

// 判断是否在pwa
const isPWA = (): boolean => {const displayModes = ['fullscreen', 'standalone', 'minimal-ui']const matchesPwa = displayModes.some(displayMode => window.matchMedia('(display-mode: ' + displayMode + ')').matches)return (matchesPwa ||window.navigator?.standalone ||document.referrer.includes('android-app://'))
}

根据前言👉vue3+ts+vite项目中使用vite-plugin-pwa搭建 PWA 项目,以及如何处理pwa安装图标的显示隐藏的文章,整合后,
配置项等不改动
只改动文章中的xx.vue文件

// xxx.vue
<template>
<button @click"addPwaBtn">pwa下载安装按钮</button>
</template>
<script lang="ts" setup>const pwaIconShow =ref(false)const showAddTipsDialog =ref(false)onMounted(() => {if (isPWA()) {console.log('在pwa环境中,不需要后续操作-埋点')pwaIconShow.value = false} else {console.log('不在pwa环境中')// 因为beforeinstallprompt事件在ios上目前不支持,所以不需要判断是否是iosif (isIOS()) {console.log('ios-显示按钮')// 如果是ios,安装pwa按钮一直显示pwaIconShow.value = true} else {pwaFunc()}}})// 注册pwaconst pwaFunc = () => {// 在主入口监听PWA注册事件,安装PWA时触发window.addEventListener('beforeinstallprompt', e => {// 没有安装pwa时,网站会进入这里、// 安装pwa后,网站不会走这里,但是卸载后也会走这里// 所以,只要走了这里,按钮就是显示的,默认按钮不显示即可console.log('pwaFunc-显示按钮-显示按钮')pwaIconShow.value = truee.preventDefault()window.deferredPrompt = e})}// 点击pwa图标const addPwaBtn= () => {if (isIOS()) {// 如果是ios,直接显示浏览器设置指引图showAddTipsDialog.value = true} else {try {window.deferredPrompt.prompt()window.deferredPrompt.userChoice.then(choiceResult => {if (choiceResult.outcome === 'accepted') {console.log('addDesktop-pwa用户安装了PWA——可打印---不显示按钮')pwaIconShow.value = false} else {console.log('用户拒绝安装PWA--可打印')}window.deferredPrompt = null})} catch {console.log('error-pwa-不支持?不显示?')pwaIconShow.value = false}}}
</script>

不在pwa环境中打开时,控制台输出:
不在<a class=pwa环境中" />
pwa环境中打开的网站,控制台输出:
在这里插入图片描述

Tips:
因为国内PWA使用较少,相关论坛讨论较少,一些文档和文章的代码都跑过,适配兼容性较差。
故,在这贴几个参考的stackoverflow帖子和github提问。
https://stackoverflow.com/questions/21125337/how-to-detect-if-web-app-running-standalone-on-chrome-mobile
https://stackoverflow.com/questions/54580414/how-can-i-detect-if-my-website-is-opened-inside-a-trusted-web-actvity
https://stackoverflow.com/questions/41742390/javascript-to-check-if-pwa-or-mobile-web
https://github.com/GoogleChromeLabs/svgomg-twa/issues/18


http://www.ppmy.cn/news/1505257.html

相关文章

Visual Studio 和 VSCode哪个更好?

在探讨Visual Studio&#xff08;VS&#xff09;和Visual Studio Code&#xff08;VSCode&#xff09;哪个更好时&#xff0c;我们需要从多个维度进行深入分析&#xff0c;包括它们的功能、性能、适用场景、用户体验、扩展性、学习曲线以及成本等方面。以下是对两者的详细比较&…

基于STM32的智能能源管理系统:HTML/CSS/JavaScript与Flask框架下的Modbus通信

随着可再生能源的普及和智能家居的兴起&#xff0c;智能能源管理系统&#xff08;Smart Energy Management System, SEMS&#xff09;逐渐成为现代家庭和企业实现高效电能利用的重要工具。本文将详细介绍一个基于STM32的智能能源管理系统的设计与实现过程&#xff0c;涵盖嵌入式…

OpenCV||超详细的图像分割

图像分割是数字图像分析中的重要环节&#xff0c;在整个研究中起着承前启后的作用&#xff0c;既是对所有图像预处理效果的一个检验&#xff0c;也是后续进行图像分析与解译的基础&#xff01; 图像分割是由图像处理到图像分析的关键步骤&#xff01; 壹、图像分割的数学定义 对…

ArkTS之npm ERR! Failed at the esbuild@0.21.5 postinstall script.

问题起因&#xff1a;想安装interface2class工具&#xff0c;将interface对象自动生成class。 错误问题&#xff1a; npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! esbuild0.21.5 postinstall: node install.js npm ERR! Exit status 1 npm ERR! npm ERR! Failed at…

linux:设置服务开机自启动、查看服务启动状态

systemctl status mynginx&#xff1a;查看mynginx是否启动的状态 mynginx.service - mynginx serviceLoaded: loaded (/usr/lib/systemd/system/mynginx.service; disabled&#xff08;这个就代表没有开机自启动&#xff09;; vendor preset: disabled)Active: inactive (dea…

在亚马逊云科技AWS上利用PEFT和RLHF高效微调AI大模型减少有害回复

简介&#xff1a; 小李哥将继续每天介绍一个基于亚马逊云科技AWS云计算平台的全球前沿AI技术解决方案&#xff0c;帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS AI最佳实践&#xff0c;并应用到自己的日常工作里。 本次我将介绍如何用亚马逊云科技的AI模型训练服…

Web 框架

Web 框架 Web服务器Web服务器的主要功能常见的Web服务器软件包 Web 框架常用 Python Web 框架选择Python Web框架的考虑因素 WSGIWSGI的主要特点WSGI的工作原理常见的WSGI服务器和框架&#xff1a; 静态资源定义与特点静态资源的类型静态资源的管理与优化 动态资源定义与特点动…

[Kimi笔记]C#入门级注意点

1. 标识符命名&#xff1a; 标识符&#xff08;类名、方法名、变量名等&#xff09;必须以字母或下划线开头&#xff0c;不能以数字或特殊字符开始。 避免使用C#的保留字&#xff0c;如 if 、 else 、 while 等。 2. 数据类型&#xff1a; 了解基本数据类型&#xff08;如 …