我們希望擴充功能和應用程式能自動更新,原因與 Google Chrome 本身相同:納入錯誤和安全性修正、新增功能或提升效能,以及改善使用者介面。
如果您使用 Chrome 開發人員資訊主頁發布應用程式,請略過這個頁面。通過預覽的 Chrome 線上應用程式商店提交內容,會自動顯示在擴充功能的 Chrome 線上應用程式商店項目清單中,並部署給最終使用者。
如果您在網路伺服器上代管 CRX 檔案,並使用企業政策將檔案推送至受管理的裝置,請繼續閱讀。您也應參閱「代管」和「封裝」相關文章。
先前在支援商店外擴充功能時,可以讓二進位檔和擴充功能在鎖定步驟中更新。不過,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 應用程式的 ID,請前往「擴充功能」頁面 (chrome://extensions)。
不過,代管應用程式不會列在「擴充功能」頁面中。您可以按照下列步驟查看任何應用程式的 ID:
- 開啟應用程式。只要點選新分頁頁面上的圖示即可。
- 開啟 JavaScript 控制台。方法是按一下扳手圖示,然後依序選擇「工具」>「JavaScript 控制台」。
- 在 JavaScript 控制台中輸入以下運算式:
chrome.app.getDetails().id
。主控台會以引號字串的形式顯示應用程式 ID。
- 程式碼集
.crx
檔案的網址。- 版本
用於用戶端判斷是否應下載
codebase
指定的.crx
檔案。這個值應與.crx
檔案manifest.json
檔案中的「version」值相符。
更新資訊清單 XML 檔案可能會包含多個擴充功能的資訊,因為它會納入多個 <app>
元素。
測試
更新檢查的預設頻率為數小時,但您可以使用「Extensions」頁面的「Update extensions now」按鈕強制更新。
進階用法:要求參數
基本自動更新機制旨在盡量減少伺服器端的工作。只要將靜態 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 特定版本或更高版本,請在更新資訊清單的 <app>
元素中加入「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 版。