自動更新

我們希望擴充功能和應用程式自動更新,達成使用 Google Chrome 的某種原因:加入錯誤與安全性修正、加入新功能或效能提升,以及改善使用者介面。

如果您是使用 Chrome 開發人員資訊主頁發布應用程式,請忽略這個網頁。通過預覽的 Chrome 線上應用程式商店提交內容會自動顯示在擴充功能的 Chrome 線上應用程式商店商品資訊中,並部署到使用者上。

如果您要在網路伺服器上代管 CRX 檔案,並使用企業政策將其推送至受管理的裝置,請繼續閱讀。建議您同時參閱「Hosting」和「Packaging」。

以往當支援商店外擴充功能時,可能會擁有原生二進位檔,並在鎖定步驟中更新擴充功能。不過,在 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 使用的 XML。詳情請參閱 http://code.google.com/p/omaha/。擴充功能系統會針對更新資訊清單的 元素使用下列屬性:

appid

擴充功能或應用程式 ID,根據公開金鑰的雜湊產生,如「封裝」一文所述。如要查看擴充功能或 Chrome 應用程式的 ID,請前往「擴充功能」頁面 (chrome://extensions)。

不過,代管應用程式並不會列在「擴充功能」頁面。您可以按照下列步驟找出任何應用程式的 ID:

  • 開啟應用程式。在「新分頁」頁面中按一下該應用程式的圖示即可。
  • 開啟 JavaScript 控制台。方法是按一下扳手圖示,然後依序選擇「Tools」>「JavaScript Console」
  • 在 JavaScript 控制台輸入下列運算式:chrome.app.getDetails().id。主控台會以加引號字串顯示應用程式 ID。
程式碼集

.crx 檔案的網址。

version

由用戶端用於判斷是否應下載 codebase 指定的 .crx 檔案。該值應與 .crx 檔案的 manifest.json 檔案中的「version」值相符。

更新資訊清單 XML 檔案可能會包含多個 元素,以包含多個副檔名的資訊。

測試

預設更新檢查頻率為幾個小時,但您可以使用「擴充功能」頁面的「立即更新擴充功能」按鈕強制更新。

進階用法:要求參數

基本自動更新機制的設計,讓伺服器端作業就像將靜態 XML 檔案拖曳到任何一般網路伺服器 (例如 Apache) 一樣,並在發布新版擴充功能時更新這個 XML 檔案。

更進階的開發人員會希望利用我們在更新資訊清單的要求中加入參數來指出擴充功能 ID 和版本。這樣他們就能為所有擴充功能使用相同的更新網址,指向執行動態伺服器端程式碼的網址,而非靜態 XML 檔案。

請求參數的格式如下:

?x=_<extension_data>_

其中 _<extension_data>_ 是採用下列格式的網址編碼字串:

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

舉例來說,假設您有兩項擴充功能,兩者皆指向同一個更新網址 (http://test.com/extension_updates.php):

  • 擴充功能 1
    • ID:「aaaaaaaaaaaaaaaaaaaaaaaa」
    • 版本:「1.1」
  • 擴充功能 2
    • ID: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 後布鏡效果 ID>
    • 版本:「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 要求網址太長 (超過 2,000 個字元),更新檢查會在必要時發出額外的 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 版。