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

news2024/11/23 21:47:55

前言:

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

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

  1. 根据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上目前不支持,所以不需要判断是否是ios
	    if (isIOS()) {
	      console.log('ios-显示按钮')
	      // 如果是ios,安装pwa按钮一直显示
	      pwaIconShow.value = true
	    } else {
	      pwaFunc()
	    }
	  }
	})
	// 注册pwa
	const pwaFunc = () => {
	  // 在主入口监听PWA注册事件,安装PWA时触发
	  window.addEventListener('beforeinstallprompt', e => {
	    // 没有安装pwa时,网站会进入这里、
	    // 安装pwa后,网站不会走这里,但是卸载后也会走这里
	    // 所以,只要走了这里,按钮就是显示的,默认按钮不显示即可
	   console.log('pwaFunc-显示按钮-显示按钮')
	   pwaIconShow.value = true
	    e.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环境中打开时,控制台输出:
不在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.coloradmin.cn/o/1983172.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Captive Portal验证原理

物联网开发系列&#xff1a;物联网开发之旅① WiFi to Ethernet: 树莓派共享无线连接至有线网口&#xff0c;自动通过Captive Poartal验证物联网开发番外篇之 Captive Portal验证原理 文章目录 工作原理技术细节登录页面的实现自动化登录 登录界面的原理主要涉及到Web认证&…

想用matlab画一个3Y轴x-y图,如何实现??

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

Windows 7和Windows10系统如何关闭重复进入Windows启动管理器的现象?

目录 背景: 方法一:使用命令提示符关闭Windows管理器 方法二:通过系统属性来关闭WIndows启动管理器 两种方法的总结: 背景: Windows 启动管理器&#xff08;Windows Boot Manager&#xff09;是 Windows 操作系统中的一个关键组件&#xff0c;它负责在系统启动时管理和引导…

千字解读《2024年前瞻中国AI大模型场景应用趋势蓝皮书》!直击大模型应用五大挑战:最大痛点在于技术面临“卡脖子”风险

7月30日&#xff0c;由前瞻产业研究院携手华为云、首钢基金、深圳上市公司协会联合发起&#xff0c;深圳市政府指导的“深圳产业会客厅——2024人工智能产业对接活动”圆满举办。 会上&#xff0c;前瞻产业研究院院长徐文强以“中国AI发展的必然与挑战”为题&#xff0c;深度剖…

《python语言程序设计》2018版第6章第25(反素数逆向拼写素数)是指一个将其逆向拼写,我不懂反素数公式看不懂。放弃了。

首先使用之前的确认素数的函数is_prime来进行素数的识别 我在网上看到来一个反素数的公式。在这个公式中我还是不能理解&#xff0c;这些数学问题。 我先把对数学的理解放到一边。 之前的版本我是采用对整数化的素数分成二个或三个的位数。然后经过倒序来显示。 I del before …

GooLeNet原理

一、GooLeNet网络结构 1*1卷积的作用&#xff1a; 实现跨通道的交互和信息整合、卷积核通道数的降维和升维&#xff0c;减少网络参数 全局平均池化层(GAP) 优点&#xff1a;抑制过拟合、GAP使特征图输入尺寸更加灵活 缺点&#xff1a;信息丢失、特征丰富性、梯度信息、复杂…

小米澎湃OS 天气-通用版 V15.0.11.0 丨适配大部分 机型

小米澎湃OS 天气-通用版 APP &#xff0c;版本号 V15.0.11.0&#xff0c;基于最新版本提取&#xff0c;纯 64 位架构。非常纯净&#xff01; 「小米天气通用版 V15.0.11.0.apk」 链接&#xff1a;https://pan.quark.cn/s/e16548df0567

如何实现pxe安装部署

此实验环境&#xff1a;rhel7主机 一、kickstart自动化安装脚本 1、安装可视化图形 [rootlocalhost ~]# yum group install "Server with GUI" 2、关闭vmware dhcp功能&#xff08;编辑-虚拟网络编辑器&#xff09; 3、httpd 1、安装httpd服务 [rootlocalhost …

【YOLOv5/v7改进系列】引入卷积块注意力模块CBAM注意力机制

一、导言 CBAM&#xff08;Convolutional Block Attention Module&#xff09;是一种简单而有效的注意力机制模块&#xff0c;旨在增强卷积神经网络&#xff08;CNN&#xff09;的表现力。该模块通过引入两个独立的注意力机制——通道注意力和空间注意力——来适应性地精炼特征…

大模型学习笔记 - LLM 参数高效微调技术

LLM 参数高效微调技术 LLM 高效微调技术 Adapter Tuning (2019 google,在Transformer 结构中嵌入adapter,tuning on BERT)Prefix Tuning (2021.01 斯坦福&#xff0c;通过virtual token构造连续型隐式prompt)Prompt Tuning&#xff08;2021.04&#xff0c;google&#xff09;P…

CSS学习 02 利用鼠标悬停制造按钮边框的渐变方向变化

效果 页面背景为深灰色&#xff0c;使用Karla字体。容器内的按钮居中显示&#xff0c;按钮有一个彩色渐变的边框。按钮的背景为黑色&#xff0c;文字为浅灰色。当鼠标悬停在按钮边框上时&#xff0c;边框的渐变方向变化&#xff0c;按钮文字变为白色&#xff0c;并且按钮内边距…

类和对象——日期类实现

目录 前言&#xff1a; 一、构造 二、运算符重载 三、与-- 四、实现与 操作 4.1 实现 操作 4..2 实现操作 4.3 效率分析 五、实现 - 与- 操作符 六、日期减日期 七、流插入和流提取 八、完整代码 Date.h Date.cpp 前言&#xff1a; 我们之前已经学习过了类和对象&…

交换机-端口安全

端口安全 1 概述 端口安全&#xff08;Port Security&#xff09;通过将接口学习到的动态MAC地址转换为安全MAC地址&#xff08;包括安全动态MAC、安全静态MAC和Sticky MAC&#xff09;&#xff0c;阻止非法用户通过本接口和交换机通信&#xff0c;从而增强设备的安全性。 2 …

力扣热题100_二叉树_94_二叉树的中序遍历

文章目录 题目链接解题思路解题代码 题目链接 94. 二叉树的中序遍历 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2] 示例 2&#xff1a; 输入&#xff1a;root [] 输…

全面提升PDF编辑效率,2024年五大顶级PDF编辑器推荐!

在这个数字化飞速发展的时代&#xff0c;PDF文件已经成为我们日常工作和学习中不可或缺的一部分。然而&#xff0c;面对PDF文件的编辑和管理&#xff0c;许多人仍然感到困惑和无助。今天&#xff0c;就让我们一起探索几款高效、易用的PDF编辑器&#xff0c;它们将彻底改变你的工…

抖音短视频素材网站有哪些?做抖音的几个素材站分享

随着短视频平台尤其是抖音的飞速发展&#xff0c;更多的内容创作者正加入到这一潮流中&#xff0c;无论是生活分享、才艺展示还是知识传播&#xff0c;一个吸引人的视频都离不开优质的素材。本文将为追求流行的抖音视频创作者介绍几个寻找热门素材的优选平台&#xff0c;帮助您…

c语言-编译预处理

9 编译预处理 预处理命令 一、预处理命令的作用 -- 在编译之前&#xff0c;需要执行的命令 -- 编译预处理是在对源程序正式编译之前的处理&#xff0c;如inlcude先替换后计算 二、预处理命令 1、#include -- 包含包括 &#xff08;1&#xff09; #include&l…

考研数学|张宇18讲太多太难,强化要不要换武老?

面对张宇18讲的难度&#xff0c;考虑是否更换辅导资料是一个值得深思的问题。首先&#xff0c;要认识到每个人的学习风格和需求是不同的。 张宇18讲可能因其深度和广度而受到一些考生的青睐&#xff0c;但同时也可能因其难度让部分考生感到挑战重重。 在决定是否更换辅导资料…

如何优雅的使用枚举类型,可以这样做!

使用枚举有时候会给我们带来了一些困扰&#xff1a; 前端展示数据&#xff0c;需要将枚举转成用户可读的数据显示。 代码中的枚举类型要存储数据库得转成数值类型。 那么本文介绍一种自动转换方案&#xff0c;大大方便前后端使用枚举类型 我们以用户状态为例&#xff0c;用…

创建型模式(Creational Patterns)之工厂模式(Factory Pattern)之工厂方法模式(Factory Method Pattern)

1. 工厂方法模式(Factory Method Pattern) 将对象的创建延迟到子类中实现&#xff0c;每个具体产品类都有一个对应的工厂类负责创建&#xff0c;从而使得系统更加灵活。客户端可以通过调用工厂方法来创建所需的产品&#xff0c;而不必关心具体的实现细节。这种模式符合开放-封闭…