当前位置: 首页 > news >正文

pwa动态修改manifest.json(start_url)

pwa动态设置manifest.json

引言

在使用pwa开发时,因需求原因,需要动态设置pwa安装应用的地址,也就是manifest.json中的start_url地址,比如说业务场景需要携带不同的参数在安装地址后台,从中遇到了很多问题,以此记录下,帮你们避坑。

使用js动态修改manifest.json

刚开始的第一反应就是通过js获取到url上的参数,在pwa页面拿到url参数并动态设置到manifest.jsonstart_url上去,代码如下:

const blob = new Blob([JSON.stringify(manifest)], { type: 'application/json' });const url = URL.createObjectURL(blob);const link = document.createElement('link');link.rel = 'manifest';link.href = url;document.head.appendChild(link);

如果环境是在pc端上是可以解决这个问题的,但是你在移动端上后你会发现pwa失效了,不管还是android还是ios上,我通过chatgpt查询了下,应该是移动端上的加载策略更为严格,js
动态修改后的格式其实是Blob形式的,也许跟这个也有关系,以下是gpt给的信息。

  1. 安全策略和权限限制

移动端浏览器通常比PC端浏览器有更严格的安全策略和权限限制。这些限制可能包括:

•	Content Security Policy (CSP):移动浏览器可能对CSP有更严格的执行,禁止从不可信来源加载资源。
•	Same-Origin Policy:Blob URL在一些移动浏览器中可能被认为不符合同源策略,导致无法加载。
  1. Blob URL的处理

PC和移动端浏览器在处理Blob URL方面可能有不同的实现方式:

•	Blob URL生命周期:在一些移动浏览器中,Blob URL的生命周期可能较短或需要特定的条件才能有效。
•	支持和兼容性:某些移动浏览器可能对Blob URL的支持不完全,特别是在加载应用关键资源(如manifest文件)时。
  1. 加载顺序和缓存行为

移动端浏览器在加载和缓存资源时可能有不同的策略:

•	加载顺序:移动浏览器可能在页面加载初期即验证并请求manifest文件,如果文件是动态生成的,可能在请求时未准备好。
•	缓存行为:移动浏览器可能对动态生成的文件有不同的缓存机制,导致文件无法及时加载。

使用node.js或者java等后端语言动态生成

通过使用node等后端服务生成是可以解决在移动端不生效的问题,下面用node示例

  function createManifest() {const manifest = {name: "Dynamic PWA",short_name: "PWA",start_url: "/",display: "standalone",background_color: "#ffffff",theme_color: "#000000",icons: [{src: "/icon-192x192.png",sizes: "192x192",type: "image/png"},{src: "/icon-512x512.png",sizes: "512x512",type: "image/png"}]};// 根据需求动态修改manifest内容const theme = new URLSearchParams(window.location.search).get('theme');if (theme === 'dark') {manifest.theme_color = "#000000";} else {manifest.theme_color = "#ffffff";}const blob = new Blob([JSON.stringify(manifest)], { type: 'application/json' });const url = URL.createObjectURL(blob);const link = document.createElement('link');link.rel = 'manifest';link.href = url;document.head.appendChild(link);
}// 调用函数创建并注入manifest
createManifest();

然后将manifest.json的href设置为接口地址就行

  <link rel="manifest" href="http://" />

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • PHP发票真假API、医疗电子票据查验、发票识别接口开发示例
  • 元组推导式
  • Keras深度学习框架第二十九讲:在自定义训练循环中应用KerasTuner超参数优化
  • qt 布局学习笔记
  • 气膜体育馆主要能耗解析—轻空间
  • 2024,java开发,已经炸了吗?
  • Python 开心消消乐
  • C# 实现腾讯云点播之媒体上传常用接口
  • java中的类加载器
  • 精通C++ STL(二):string类的模拟实现
  • AI绘画图生图有什么用?
  • React项目中使用各表单库性能对比调研报告
  • 等保服务是一次性服务吗?为什么?怎么理解?
  • wireshark抓包,丢包分析?
  • Appium系列(2)元素定位工具appium-inspector
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 30秒的PHP代码片段(1)数组 - Array
  • JAVA_NIO系列——Channel和Buffer详解
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • MobX
  • ng6--错误信息小结(持续更新)
  • Redis的resp协议
  • Sequelize 中文文档 v4 - Getting started - 入门
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 关于字符编码你应该知道的事情
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 简单数学运算程序(不定期更新)
  • 马上搞懂 GeoJSON
  • 学习笔记TF060:图像语音结合,看图说话
  • 用 Swift 编写面向协议的视图
  • 运行时添加log4j2的appender
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • 2017年360最后一道编程题
  • Mac 上flink的安装与启动
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • ###STL(标准模板库)
  • #includecmath
  • #NOIP 2014#Day.2 T3 解方程
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (1)无线电失控保护(二)
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (SERIES12)DM性能优化
  • (vue)el-tabs选中最后一项后更新数据后无法展开
  • (八)Flink Join 连接
  • (搬运以学习)flask 上下文的实现
  • (二)构建dubbo分布式平台-平台功能导图
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)springboot教学评价 毕业设计 641310
  • (汇总)os模块以及shutil模块对文件的操作
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • .axf 转化 .bin文件 的方法
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记