Firefox 网络扩展自动更新未列出和自托管的扩展

Firefox web extension Auto update unlisted-and-self-hosted extension

我有一个从 chrome 移植过来的 firefox 网络扩展。这是一个特定于站点的扩展程序,我将其托管在我的网络服务器上,以避免在开发人员中心上花费冗长的审查时间。

用户通过单击我的网页上的按钮来安装扩展程序。假设当前的扩展版本是 3。按钮点击处理程序是这样的

document.getElementById('install_ext').addEventListener('click', function (e) {
    window.location.href = '/public/ffext_3.xpi';
});

当构建了新版本的扩展时,比如版本 4,我将删除现有的 ffext_3.xpi 文件,在 public 文件夹中添加新的 ffext_4.xpi 文件并修改href in js 到服务器上的'/public/ffext_4.xpi'。还有一些 UI 级别的处理,如如果扩展不存在则显示安装按钮,如果更新可用则显示更新按钮等

到目前为止一切正常。但是有一些机械的事情正在做。

  1. 我必须手动修改js文件中的href。

  2. 用户必须在 UI 提示时手动更新扩展。

我尝试使用 InstallTrigger 对象,但也必须提供完整的 xpi url,其中包含版本号。

document.getElementById('install_ext').addEventListener('click', function (e) {
    var params = {
        "MyExtension": {URL: 'https://addons.mozilla.org/firefox/downloads/file/12345/myext-0.1.2-fx.xpi',
            IconURL: '/public/exticon.png',
            Hash: 'sha1:1234567890abcdefghij1234567890abcdefghij',
            toString: function () {
                return this.URL;
            }
        }
    };
    InstallTrigger.install(params);
});

我不确定每次上传新扩展时是否必须更新此 URL。我试图避免审核延迟,因此我不想使用 InstallTrigger 方式,除非它是在用户浏览器上自动更新扩展的唯一方式。

有没有办法在没有用户干预的情况下自动更新扩展?我在想,如果可以自动更新,我可以避免更改 xpi 的文件名并将 href 设为 '/public/ffext.xpi'。我是对的还是我需要继续更新 urls 即使有自动更新机制?

MDN 的 Updates page covers setting up automatic updates for an add-on. For add-ons hosted on AMO,无需插件开发人员执行任何操作即可处理此问题。

您需要一个 URL 可以为您的用户提供 JSON 格式的更新清单。

网络扩展:
对于 WebExtensions,您需要将 manifest.json 中的 update_url 键设置为更新清单的 URL。作为示例(来自上面的 MDN 页面:

"applications": {
  "gecko": {
    "update_url": "https://example.com/updates.json"
  }
}

所有其他类型的插件:
对于非 WebExtension 附加组件,此 URL 在 instal.rdf 文件中设置。 [WebExtensions没有instal.rdf文件,其他类型的插件没有manifest.json files.1] 这样的 instal.rdf 条目看起来像(添加到 <Description about="urn:mozilla:install-manifest"> 元素):

<em:updateURL>https://example.com/updates.json</em:updateURL>

更新清单

示例更新清单可能如下所示(与所有代码一样,来自上述 MDN 更新页面):

{
  "addons": {
    "addon@example.com": {
      "updates": [
        { "version": "0.1",
          "update_link": "https://example.com/addon-0.1.xpi" },
        { "version": "0.2",
          "update_link": "http://example.com/addon-0.2.xpi",
          "update_hash": "sha256:fe93c2156f05f20621df1723b0f39c8ab28cdbeec342efa95535d3abff932096" },
        { "version": "0.3",
          "update_link": "https://example.com/addon-0.3.xpi",
          "applications": {
            "gecko": { "strict_min_version": "44" } } }
      ]
    }
  }
}

  1. 您可以在附加 SDK 扩展或 Bootstrap/Restartless 附加组件 (Embedded WebExtensions) 中使用 WebExtension。如果您在基于附加组件的附加组件 SDK 中这样做,您可能拥有用于描述 Firefox 附加组件的所有文件。 package.json (Add-on SDK) 和 manifest.json (WebExtension) 在 Add-on SDK 扩展之前打包。打包后(例如jpm xpi),它会有一个install.rdf并且可能有一个chrome.manifest(两者都用于所有其他类型的 Firefox 附加组件)。