我们希望扩展程序和应用自动更新,原因与 Google Chrome 本身大同小异:纳入 bug 和安全修复程序、添加新功能或性能增强功能,以及改进界面。
如果您使用 Chrome 开发者信息中心发布应用,则应忽略此页面。通过预览的 Chrome 应用商店提交内容会自动显示在扩展程序的 Chrome 应用商店商品详情中,并部署给最终用户。
如果您在 Web 服务器上托管 CRX 文件,并使用企业政策将其推送到受管设备,请继续阅读。您还应阅读托管和打包。
以前,当支持非 Google 商店扩展程序时,二进制文件和扩展程序可以同步更新。不过,托管在 Chrome 应用商店中的扩展程序会使用开发者无法控制的 Chrome 更新机制进行更新。扩展程序开发者应谨慎更新对二进制文件有依赖项的扩展程序(例如,使用 NPAPI 的旧版扩展程序)。
概览
- 清单可能包含一个“update_url”字段,指向用于执行更新检查的位置。
- 更新检查返回的内容是一个更新清单 XML 文档,其中列出了扩展程序的最新版本。
浏览器每隔几个小时就会检查是否有任何已安装的扩展程序或应用具有更新网址。它会针对每个网址发出请求,以查找更新清单 XML 文件。如果更新清单中提及的版本比已安装的版本更高,浏览器会下载并安装新版本。与手动更新一样,新 .crx
文件必须使用与已安装版本相同的私钥进行签名。
更新网址
如果您要托管自己的扩展程序或应用,则需要向 manifest.json
文件添加“update_url”字段,如下所示:
{
"name": "My extension",
...
"update_url": "http://myhost.com/mytestextension/updates.xml",
...
}
更新清单
服务器返回的更新清单应为如下所示的 XML 文档(突出显示的部分表示您应修改的部分):
<?xml version='1.0' encoding='UTF-8'?>
<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>
<app appid='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'>
<updatecheck codebase='http://myhost.com/mytestextension/mte_v2.crx' version='2.0' />
</app>
</gupdate>
此 XML 格式借鉴了 Google 更新基础架构 Omaha 所使用的格式。如需了解详情,请参阅 http://code.google.com/p/omaha/。扩展程序系统会对更新清单的 <app>
和 <updatecheck>
元素使用以下属性:
- appid
扩展程序或应用 ID,基于公钥的哈希值生成,如打包中所述。您可以前往“扩展程序”页面 (chrome://extensions) 查找扩展程序或 Chrome 应用的 ID。
不过,托管的应用不会在“扩展程序”页面上列出。您可以按照以下步骤查找任何应用的 ID:
- 打开该应用。为此,您可以在“新标签页”页面上点击该应用的图标。
- 打开 JavaScript 控制台。具体方法是,点击扳手图标,然后依次选择 Tools > JavaScript Console。
- 在 JavaScript 控制台中输入以下表达式:
chrome.app.getDetails().id
。控制台会以带引号的字符串显示应用的 ID。
- 代码库
指向
.crx
文件的网址。- 版本
供客户端确定是否应下载
codebase
指定的.crx
文件。它应与.crx
文件的manifest.json
文件中的“version”值一致。
更新清单 XML 文件可以包含多个 <app>
元素,从而包含多个扩展程序的相关信息。
测试
默认的更新检查频率为数小时,但您可以使用“扩展程序”页面上的立即更新扩展程序按钮强制更新。
高级用法:请求参数
基本自动更新机制旨在最大限度地减少服务器端工作。您只需将静态 XML 文件添加到任何网络服务器(例如 Apache),并在发布扩展程序的新版本时更新该 XML 文件。
更高级的开发者可以利用我们向更新清单请求添加参数来指明扩展程序 ID 和版本这一事实。然后,他们可以为所有扩展程序使用相同的更新网址,指向运行动态服务器端代码的网址,而不是静态 XML 文件。
请求参数的格式如下:
?x=_<extension_data>_
其中 _<extension_data>_
是采用以下格式的网址编码字符串:
_id=<id>_&v=_<version>_
例如,假设您有两个扩展程序,它们都指向同一更新网址 (http://test.com/extension_updates.php
):
- 扩展程序 1
- ID:"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- 版本:“1.1”
- 扩展程序 2
- ID:"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
- 版本:“0.4”
更新每个单独扩展程序的请求如下所示:
http://test.com/extension_updates.php?x=id%3Daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa%26v%3D1.1
http://test.com/extension_updates.php?x=id%3Dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb%26v%3D0.4
在针对每个唯一更新网址的单个请求中,可以列出多个扩展程序。例如,如果用户安装了这两个扩展程序,则这两个请求会合并为一个请求:
http://test.com/extension_updates.php?x=id%3Daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa%26v%3D1.1&x=id%3Dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb%26v%3D0.4
如果使用相同更新网址的已安装扩展程序数量足够多,以致于 GET 请求网址过长(大约超过 2000 个字符),更新检查会根据需要发出其他 GET 请求。
高级用法:最低浏览器版本
随着我们向扩展程序系统添加更多 API,您可能需要发布仅适用于较新版浏览器的更新版扩展程序或应用。虽然 Google Chrome 本身会自动更新,但大多数用户可能需要几天时间才能更新到任何给定的新版本。如需确保给定更新仅适用于特定版本或更高版本的 Google Chrome,您可以将“prodversionmin”属性添加到更新清单中的 <app>
元素。例如:
<?xml version='1.0' encoding='UTF-8'?>
<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>
<app appid='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'>
<updatecheck codebase='http://myhost.com/mytestextension/mte_v2.crx' version='2.0' prodversionmin='3.0.193.0'/>
</app>
</gupdate>
这样可确保只有在用户使用 Google Chrome 3.0.193.0 或更高版本时,才会自动更新到版本 2。