自动更新

出于某些与 Google Chrome 本身相同的原因,我们希望扩展程序和应用自动更新:纳入 bug 和安全修复程序、添加新功能或增强性能,以及改进界面。

如果您是通过 Chrome 开发者信息中心发布应用,则应忽略此页面。通过预览的 Chrome 应用商店提交内容会自动显示在扩展程序的 Chrome 应用商店商品列表中,并部署给最终用户。

如果您在 Web 服务器上托管 CRX 文件,并使用企业政策将其推送到受管设备,请继续阅读下文。您还应阅读 Hosting(托管)和 Packaging(打包)。

以前,如果支持离店扩展程序,可以在锁定步骤中更新原生二进制文件和扩展程序。不过,Chrome 应用商店中托管的扩展程序会通过 Chrome 更新机制进行更新,而该机制不受开发者控制。扩展程序开发者在更新依赖于原生二进制文件的扩展程序(例如,使用 NPAPI 的旧版扩展程序)时应格外小心。

概览

  • 清单可能包含“update_url”字段,指向用于执行更新检查的位置。
  • 更新检查返回的内容是一个更新清单 XML 文档,其中列出了相应扩展程序的最新版本。

浏览器每隔几小时就会检查安装的扩展程序或应用程序是否有更新网址。对于每个目录,它会向相应网址发出请求,以查找更新清单 XML 文件。如果更新清单中提及的版本高于已安装版本,浏览器就会下载并安装新版本。与手动更新一样,必须使用与当前已安装的版本相同的私钥为新的 .crx 文件签名。

更新网址

如果您托管了自己的扩展程序或应用,则需要将“update_url”字段添加到 manifest.json 文件中,如下所示:

{
  "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/。扩展程序系统会为更新清单的 元素使用以下属性:

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 文件可能会通过添加多个 元素来包含有关多个扩展程序的信息。

测试

默认的更新检查频率为几个小时,但您可以使用“扩展程序”页面的立即更新扩展程序按钮强制进行更新。

高级用法:请求参数

基本的自动更新机制旨在使服务器端的工作变得简单,只需将静态 XML 文件拖放到任何普通 Web 服务器(如 Apache),并在发布新版本的扩展程序时更新 XML 文件即可。

更高级的开发者可能希望利用我们在更新清单请求中添加参数来指示扩展程序 ID 和版本的这一事实。然后,他们可以为其所有扩展程序使用相同的更新网址,指向运行动态服务器端代码(而非静态 XML 文件)的网址。

请求参数的格式为:

?x=_<extension_data>_

其中,_<extension_data>_ 是采用以下格式的网址编码字符串:

_id=<id>_&v=_<version>_

例如,假设您有两个扩展程序,它们都指向同一个更新网址 (http://test.com/extension_updates.php):

  • 扩展程序 1
    • ID:“aaaaaaaaaaaaaaaaaaaaaaaaaaaaa”
    • 版本:“1.1”
  • 扩展程序 2
    • ID:“bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb”
    • 版本:“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”属性。例如:

<?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。