当前位置:网站首页>浏览器下载快捷方式到桌面(PWA)
浏览器下载快捷方式到桌面(PWA)
2022-07-31 22:50:00 【小蟹 !】
在工作中遇到这样一个需求,要在web上完成将网页制作成快捷方式保存到桌面,可以通过桌面的快捷方式直接打开该网页。问题困扰了我许久(主要是不了解还有这项技术?偶然在网上看见这项技术的名称-PWA(Progressive Web App))。本文详解如何完成这个功能
什么是PWA?
效果展示
如何实现这个功能?
目录结构
- icon.png ----图标,下载时以及到桌面/chrome:apps中展示的图标
- index.html ----html文件
- mainfest.json ----json文件,通过这个json向浏览器暴露名称、icon以及URL等,供浏览器使用
- service-work.js ----是一个可编程的 Web Worker,它就像一个位于浏览器与网络之间的客户端代理,可以拦截、处理、响应流经的 HTTP 请求
- sw.js ----一个js文件,主要吧处理了下载功能,也可将其放入html中
icon.png
- 一个图标文件,建议大小128x128及以上
index.html
- 在index.html中引入了mainfest.json文件
<link rel="manifest" href="mainfest.json">
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<!-- 引入json文件 -->
<link rel="manifest" href="mainfest.json">
</head>
<body>
<script> // 检测浏览器是否支持SW if (navigator.serviceWorker != null) {
navigator.serviceWorker.register('sw.js') .then(function (registartion) {
console.log('支持sw:', registartion.scope) }) } else {
console.log('不支持sw:') } navigator.serviceWorker.register('sw.js').then(function () {
console.log('serviceWorker registered') }).catch(function (e) {
console.log("serviceWorker Error",e); }) let deferredPrompt; window.addEventListener('beforeinstallprompt', (e) => {
// Prevent Chrome 67 and earlier from automatically showing the prompt e.preventDefault(); // Stash the event so it can be triggered later. deferredPrompt = e; window.download = function (acceptedCallbackFunction) {
// Show the prompt deferredPrompt.prompt(); // Wait for the user to respond to the prompt deferredPrompt.userChoice.then((choiceResult) => {
if (choiceResult.outcome === 'accepted') {
console.log('User accepted the A2HS prompt'); if (acceptedCallbackFunction) {
acceptedCallbackFunction(); } } else {
console.log('User dismissed the A2HS prompt'); } deferredPrompt = null; }); }; }); </script>
</body>
</html>
mainfest.json
- 包含了背景、图标、描述、url等信息,
- 各属性详解pwa-mainfest
{
"background_color": "purple",
"display": "fullscreen",
"icons": [{
"src": "icon.png",
"sizes": "256x256",
"type": "image/png"
}],
"name": "Strange elimination: online elimination",
"short_name": "Strange elimination",
"start_url": "https://localhost:5555/index.html?campaignid=webapp"
}
service-work.js
/** * Welcome to your Workbox-powered service worker! * * You'll need to register this file in your web app and you should * disable HTTP caching for this file too. * See https://goo.gl/nhQhGp * * The rest of the code is auto-generated. Please don't update this file * directly; instead, make changes to your Workbox build configuration * and re-run your build process. * See https://goo.gl/2aRDsh */
importScripts("https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-sw.js");
self.addEventListener('message', (event) => {
if (event.data && event.data.type === 'SKIP_WAITING') {
self.skipWaiting();
}
});
workbox.core.clientsClaim();
/** * The workboxSW.precacheAndRoute() method efficiently caches and responds to * requests for URLs in the manifest. * See https://goo.gl/S9QRab */
self.__precacheManifest = [].concat(self.__precacheManifest || []);
workbox.precaching.precacheAndRoute(self.__precacheManifest, {
});
workbox.routing.registerNavigationRoute(workbox.precaching.getCacheKeyForURL("/index.html"), {
blacklist: [/^\/_/,/\/[^\/]+\.[^\/]+$/],
});
sw.js
importScripts("service-worker.js");
self.addEventListener('install', (e) => {
console.log('sw install');
});
self.addEventListener('fetch', (e) => {
});
然后将这个目录部署到你的服务器中(需HTTPS服务)。注意json文件中的url需要和index.html文件所在url一致。打开这个url即可看见搜索框中有这个下载按钮了。成功完成后你就可以在计算机桌面看见生成了一个快捷方式。如果你是用chrome下载的,你也可以在chrome中打开chrome://apps/链接,也可以在其中找到你下载的应用
边栏推荐
- hboot and recovery, boot.img, system.img
- How to reduce the gap between software design and implementation
- 网络安全--通过握手包破解WiFi(详细教程)
- SQL injection Less38 (stack injection)
- LeetCode 第 304 场周赛
- SQL injection Less54 (limited number of SQL injection + union injection)
- HTC使用官方固件作为底包制作rom卡刷包教程
- Interview assault 69: TCP reliable?Why is that?
- 数据分析(一)——matplotlib
- Network security - crack WiFi through handshake packets (detailed tutorial)
猜你喜欢
Flink_CDC construction and simple use
Golang - from entry to abandonment
Shell common scripts: Nexus batch upload local warehouse enhanced version script (strongly recommended)
Unity - by casting and cloning method dynamic control under various UGUI create and display
C#中引用类型的变量做为参数在方法调用时加不加 ref 关键字的不同之处
Chapter Six
程序进程和线程(线程的并发与并行)以及线程的基本创建和使用
基于mysql的消息队列设计
Daily practice——Randomly generate an integer between 1-100 and see how many times you can guess.Requirements: The number of guesses cannot exceed 7 times, and after each guess, it will prompt "bigger"
什么是客户画像管理?
随机推荐
22年8月推广大使额外奖励规则
10大主流3D建模技术
How to reduce the gap between software design and implementation
C程序设计-方法与实践(清华大学出版社)习题解析
Dry goods | 10 tips for MySQL add, delete, change query performance optimization
UserAgent resolution
SQL injection Less42 (POST type stack injection)
消息队列存储消息数据的MySQL表格
【FPGA教程案例43】图像案例3——通过verilog实现图像sobel边缘提取,通过MATLAB进行辅助验证
支付模块实现
Istio introduction
Daily--Kali opens SSH (detailed tutorial)
Fixed-length usage of nanopb string type based on RT1052 Aworks (27)
一款国外开发的高质量WordPress下载站模板主题
Advanced Algebra _ Proof _ Any matrix is similar to an upper triangular matrix
如何减少软件设计和实现之间鸿沟
TestCafeSummary
"SDOI2016" Journey Problem Solution
[NLP] What is the memory of the model!
输入输出优化