判断用户是否在pwa环境中打开运行?(已安装的 PWA 与未安装的 PWA 网站之间有什么区别?)以及pwa安装成功/失败的回调

news2024/9/27 15:32:05

前言:

👉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('pwa用户安装了PWA——可打印---不显示按钮')
	        	pwaIconShow.value = false
	        } else {
	          console.log('用户拒绝安装PWA--可打印')
	        }
	        window.deferredPrompt = null
	      })
	    } catch {
	      console.log('error-pwa-不支持?不显示?')
	      pwaIconShow.value = false
	    }
	  }
	}
</script>

不在pwa环境中打开时,控制台输出:
不在pwa环境中
在pwa环境中打开的网站,控制台输出:
在这里插入图片描述

pwa安装成功\失败的回调

上述代码中的console.log('pwa用户安装了PWA——可打印---不显示按钮')以及console.log('用户拒绝安装PWA--可打印'),都是可以打印出来的,但是安卓、win可以拿到到回调事件,但是ios、macOS是拿不到回调事件

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/1985340.html

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

相关文章

下载qwen2-72b报错

下载大模型或者是国外的大文件&#xff0c;最好配置git的代理&#xff0c;报错如下&#xff1a;https://modelscope.cn/models/qwen/Qwen2-72B 增加以下配置解决 git config --global http.sslVerify “false” git config --global advice.detachedHead false

小程序测试文档

预约小程序测试文档 一、访客 1、访客审批预约在vue修改过成功以后&#xff0c;在小程序页面未显示 解决办法 在pages\appointQuery\appointQuery.wxml页面中修改 <view class"order_right"><view class"order_status_left" wx:if"{{item…

想发Top实力不够:顶刊也能“水”!影响因子9.1 ,国人友好,2个月秒速录用

本周投稿推荐 SCI&EI • 4区“水刊”&#xff0c;纯正刊&#xff08;来稿即录&#xff09; • CCF-B类&#xff0c;IEEE一区-Top&#xff08;3天初审&#xff09; EI • 各领域沾边均可&#xff08;2天录用&#xff09; 知网&#xff08;CNKI&#xff09;、谷歌学术 …

exptern “C“的作用,在 C 和 CPP 中分别调用 openblas 中的 gemm 为例

openblas提供的sgemm有两种方式&#xff0c;一种是通过cblas&#xff0c;另一种是直接声明并调用 sgemm_ 其中&#xff0c;cblas方式是更正规调用方法&#xff1b; 1&#xff0c;调用openblas的 sgemm 的两种方式 1.1 c语言程序中使用 sgemm hello_sgemm.c #include <st…

层次分析法(评价类问题)

本文章内容来自&#xff1a;​​​​​​​ 层次分析法模型讲解(附matlab和python代码) 【数学建模快速入门】数模加油站 江北_哔哩哔哩_bilibili 一. 概念 做决策依托于量化分析&#xff0c;量化分析依托于选择的指标以及各项指标的权重&#xff08;重要性及对结果的影响程度…

XLT开关矩阵

开关矩阵 苏州新利通 系列化开关矩阵是提高被测件测试效率、实现自动化测试的核心设备&#xff0c;是基于标准控制平台可进行定制化设计的产品。系列化开关矩阵工作频率范围覆盖DC~67GHz&#xff0c;可通过LAN、GPIB、RS232和USB-B等标准控制接口&#xff0c;支持客户端、Web…

ElasticSearch安装与集群部署

ElasticSearch安装与集群部署 很多小伙伴第一次接触ElasticSearch的时候是一脸愁容,这个东西他怎么用啊,不知道从哪里安装,那我们今天就着重从哪里下载?怎么下载?怎么安装?来研究一下吧! windows下载安装ElasticSearch 下载地址&#xff1a;https://www.elastic.co/cn/do…

移动端下拉加载更多(h5,小程序)

1.h5,使用原生方式监听页面滚动下拉加载更多 <template><div></div> </template><script> export default {data() {return {loadflag: true,maxpages: 0, //最大页码currentpage: 0, //当前页listData: [],config: {page: 1,pageSize: 15,tota…

Unity开发的Domino多米诺3D小游戏源码

Unity开发的Domino多米诺3D小游戏源码下载地址

计算机组成原理 - 总线、输入/输出系统

总线 考纲内容 总线的基本概念总线的组成及性能指标总线事务和定时 本章大多以选择题的形式出现&#xff0c;特别是总线的特点、猝发传输方式、性能指标、定时方式及常见的总线标准等 思考以下问题&#xff1a; 1、引入总线结构有什么好处? 2、引入总线结构会导致什么问题…

公司官网为何建议用OV SSL证书?如何申请?

随着网络安全威胁的日益增多&#xff0c;保护用户数据安全变得尤为重要。其中SSL&#xff08;Secure Sockets Layer&#xff09;证书成为了保障网站安全的关键技术之一。而在众多SSL证书中&#xff0c;OV&#xff08;Organization Validation&#xff09;SSL证书因其独特的优势…

JVM(九)深入解析Java字节码技术与执行模型

这篇文章深入探讨了Java字节码技术&#xff0c;包括字节码的简介、获取字节码清单的方法、解读字节码清单、查看class文件中的常量池信息、查看方法信息、线程栈与字节码执行模型、方法体中的字节码解读、对象初始化指令、栈内存操作指令、局部变量表、流程控制指令、算术运算指…

读取压缩文件

读取压缩文件 1、背景 D盘下面有一个zipTest1.zip压缩文件 1.1 zipTest里面的内容 1.2 zipTest中有三个文件夹dir1、dir2、dir3 1.3 每一个文件夹下都有一个.txt文件 2、要求 读取D盘下面zipTest1.zip压缩文件里的内容到D盘下面zipTest2 3、实现 public static void main…

Go语言使用cobra开发第一个命令行程序

源码下载 本教程源码下载地址&#xff1a;https://github.com/zhangdapeng520/zdpgo_cobra_examples 案例说明 实现一个简单的命令行程序&#xff0c;能够将输入的单词转换为大写。 使用演示 执行命令&#xff1a; go run .\main.go word -u -s hello输出结果&#xff1a…

XXE靶机教学

arp-scan -l主机发现 arp-scan -l 端口扫描 nmap -p- 192.168.48.139 服务探测 nmap -p80,5355 -sT -sC -sV 192.168.48.139 目录扫描 dirsearch -u http://192.168.48.139 访问robots.txt 发现两个可访问路径 burp抓包 测试是否存在xxe漏洞 <?xml version "1.…

超声波清洗机性价比高的型号有哪些?四款值得关注的高性能超声波清洗机推荐

如果你发现眼镜变得非常脏&#xff0c;甚至出现青铜色的污渍&#xff0c;那说明是时候清洁眼镜了&#xff01;很多人往往不在意这些细节&#xff0c;结果眼镜越戴越模糊&#xff0c;实际上这主要是因为镜片上的油污、手指皮肤的残留以及生活中的灰尘积累。如果不及时清洁&#…

【实现100个unity特效之15】最简单的方法使用shader graphs实现2d树叶草的随风摇摆效果

文章目录 前言新建shader graphs新建材质效果完结 前言 本文只是实现一个简单版本的2d树叶草随风摇摆的效果&#xff0c;如果你想要实现更加复杂的效果&#xff0c;包括2d互动草&#xff0c;你可以参考我之前的文章&#xff1a; 【推荐100个unity插件之24】实现2d交互式草树叶…

瑞熙贝通智慧库房物料管理系统v3.0

一、系统介绍 智慧库房物料软件是库房全流程管理中的管理方式&#xff0c;为强化库房在各个环节管理&#xff0c;提高库房物料管理的效率&#xff0c;针对库房物料管理中存在的问题&#xff0c;瑞熙贝通在库房物料管理工作等方面不断创新&#xff0c;在制度建设、管理流程设计…

2024,Java开发在中国市场还有发展前景吗?

随着2024年的到来&#xff0c;Java作为一种经典而强大的编程语言&#xff0c;依然在中国的软件开发市场中扮演着重要角色。然而&#xff0c;许多人对Java的未来发展前景持有不同的看法。让我们来探讨一下当前情况和未来的走向。 Java程序员真的过剩了吗&#xff1f; 2023年, 各…

深度学习 —— 个人学习笔记14(ResNet、DenseNet)

声明 本文章为个人学习使用&#xff0c;版面观感若有不适请谅解&#xff0c;文中知识仅代表个人观点&#xff0c;若出现错误&#xff0c;欢迎各位批评指正。 二十八、残差网络&#xff08; ResNet &#xff09; import torch import torchvision import time from torch impo…