【问题标题】:How to create PWA manifest.json dynamic?如何动态创建 PWA manifest.json?
【发布时间】:2019-07-13 20:26:25
【问题描述】:

我在 manifest.json 中使用静态变量变量创建了一个功能,例如:

- 姓名 - 简称 -- start_url

“添加到主屏幕”运行良好。 当我动态设置 manifest.json 变量时,添加到屏幕不起作用

基本上我有一个电子商务 PWA。我的要求如下:如果用户访问应用程序 url(例如: www.example.com/products/PRODUCT_NAME_A ),他应该能够在主屏幕上创建一个快捷链接,或者根据不同的 URL 创建许多他们想要的链接。

您还可以查看我目前在 javascript 中所做的代码:



var domain = document.location.origin;
var currentUrl = window. location. href;

var myDynamicManifest = {
    "name": "My App",
    "short_name": "My App",
    "description": "This is my App",
    "start_url": currentUrl,
    "scope": ".",
    "background_color": "#5F6EDD",
    "theme_color": "#efbc4b",
    "orientation": "portrait",
    "display": "standalone",
    "lang": "en",
    "dir": "ltr",
    "icons": [
        {
          "src"     : domain + "/images/logo/logo_70x70.png",
          "sizes"   : "70x70",
          "type"    : "image/png"
        },
        {
          "src"     : domain + "/images/logo/logo_120x120.png",
          "sizes"   : "120x120",
          "type"    : "image/png"
        },
        {
          "src"     : domain + "/images/logo/logo_144x144.png",
          "sizes"   : "144x144",
          "type"    : "image/png"
        },

    ]
    }

const stringManifest = JSON.stringify(myDynamicManifest);

const blob = new Blob([stringManifest], {type: 'application/javascript'});

const manifestURL = URL.createObjectURL(blob);

document.querySelector('#manifest').setAttribute('href', manifestURL);

我预计输出如下:http://prntscr.com/oej48u

【问题讨论】:

  • 这不是你之前问的同一个问题吗?
  • 是的,确实如此。不幸的是,我错误地删除了以前的。
  • 你试过了,它对你不起作用?你遇到了什么问题? technowhisp.com/dynamic-pwa-manifest
  • 当我使用此代码时无法添加到屏幕
  • 如果您发布了您从该页面尝试过的代码,以及您看到的失败之处,那么也许人们可以帮助您找出不适合您的地方。这通常比一般的“如何”问题得到更多的答复。

标签: progressive-web-apps manifest.json


【解决方案1】:

我意识到这是一个老问题。但是,我想我会传递我是如何解决这个问题的。我的前端通过 Netlify 提供服务,后端 API 都是 GCP Cloud Functions。我添加了一个响应 /manifest?startUrl=...&name=... 并返回正确 manifest.json 内容的云函数。然后,在单页应用程序中,它会在页面加载或用户四处导航时动态更新标头 <link /> 以指向适当的 URL。

客户端:

const manifest = document.getElementById('manifest');
const nextManifest = document.createElement('link');
nextManifest.id = 'manifest';
nextManifest.rel = 'manifest';
nextManifest.href =
  `https://<cloud function host>/manifest?startUrl=${
    encodeURIComponent(`/events/${token}`)
  }&name=${encodeURIComponent(event.name)}`;
manifest.parentNode.replaceChild(nextManifest, manifest);

服务器端:


const manifest = {
  "short_name": "Photo Feed",
  "name": "Photo Feed",
  "icons": [
    {
      "src": "shortcut-icon.png",
      "sizes": "16x16",
      "type": "image/png"
    },
    {
      "src": "mobile-app-icon.png",
      "sizes": "180x180",
      "type": "image/png"
    }
  ],
  "start_url": ".",
  "display": "standalone",
  "theme_color": "#591A0C",
  "background_color": "#06B8B3"
};

/**
 * Responds to any HTTP request.
 *
 * @param {!express:Request} req HTTP request context.
 * @param {!express:Response} res HTTP response context.
 */
exports.manifest = (req, res) => {
  res.set('Access-Control-Allow-Origin', '*');

  if (req.method === 'OPTIONS') {
    res.set('Access-Control-Allow-Methods', 'GET');
    res.set('Access-Control-Allow-Headers', 'Content-Type');
    res.set('Access-Control-Max-Age', '3600');
    res.status(204).send('');
    return;
  }

  if (req.method === 'GET') {
    // take /?startUrl=<url> and return a manifest file
    // with `star_url`, same with name
    if (req.query.startUrl) {
      res.json({
        ...manifest,
        short_name: req.query.name || manifest.short_name,
        name: req.query.name ? `${req.query.name} Photo Feed` : manifest.name,
        start_url: req.query.startUrl,
      });
    } else {
      res.json(manifest);
    }
  }

  res.status(405).send();
};

【讨论】:

  • 这也是我的解决方案,但不幸的是我发现它不可靠。浏览器在何时需要新的清单文件时有自己的逻辑,而且似乎不一定在每次路由更改时都如此。这意味着用户最终可能会安装过时的清单。仍在寻找解决方案。
  • 您找到更可靠的解决方案了吗?
  • 顺便说一句,请参阅https://web.dev/manifest-updates/ 以了解manifest.json 更新的逻辑。不幸的是,涉及blob: 和data: URL 的其他解决方案也不能可靠地工作,因为manifest.json URL 应该是静态的,如那里所述。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
  • 2018-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多