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 级别的处理,如如果扩展不存在则显示安装按钮,如果更新可用则显示更新按钮等
到目前为止一切正常。但是有一些机械的事情正在做。
我必须手动修改js文件中的href。
用户必须在 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" } } }
]
}
}
}
- 您可以在附加 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 附加组件)。
我有一个从 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 级别的处理,如如果扩展不存在则显示安装按钮,如果更新可用则显示更新按钮等
到目前为止一切正常。但是有一些机械的事情正在做。
我必须手动修改js文件中的href。
用户必须在 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" } } }
]
}
}
}
- 您可以在附加 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 附加组件)。