# 自動升級
## Contents
1. [Overview](autoupdate.html#H2-0)
2. [Update URL](autoupdate.html#H2-1)
3. [Update manifest](autoupdate.html#H2-2)
4. [Testing](autoupdate.html#H2-3)
5. [Advanced usage: request parameters](autoupdate.html#H2-4)
1. [Future work](autoupdate.html#H3-5)
6. [Advanced usage: minimum browser version](autoupdate.html#H2-6)
我們希望擴展能自動升級,理由和讓chrome自動升級一樣:修改程序bug和安全漏洞 ,增加新功能,提升性能,改善體驗。
如果你通過[Chrome Developer Dashboard](https://chrome.google.com/webstore/developer/dashboard),發布你的擴展,可以忽略此頁。你可以使用Dashboard發布更新過的版本給用戶,就像在Extensions Gallery 和Chrome Web Store面一樣。.
## 概述
* 一個擴展的manifest文件里面必須指定一個"update_url"來執行升級檢測。
* 擴展可以托管在Chrome Web Store,也可以發布到極速瀏覽器應用開放平臺上。
* 如果托管在Chrome Web Store則update_url應該是:http://clients2.google.com/service/update2/crx
* 如果托管在極速瀏覽器應用開放平臺上則update_url應該是:http://upext.chrome.#/intf.php?method=ExtUpdate.query
為了能夠快速和穩定的更新升級,我們建議將擴展托管在360服務器。
**注:如果不指定update_url,在使用360同步服務的情況下安裝擴展,重啟瀏覽器后導致擴展丟失。**
## Update URL 升級url
如果將擴展托管在360服務器上,那么你需要在[manifest.json](manifest.html)文件里面加一個update_url字段,如下:
```
{
"name": "My extension",
...
**"update_url": "http://upext.chrome.#/intf.php?method=ExtUpdate.query"**,
...
}
```
## 升級 manifest
服務器返回的升級manifest 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/](http://code.google.com/p/omaha/))
**appid**
屬性appid是一這個擴展的id,基于擴展的公鑰hash計算而來,在[Packaging](packaging.html)。里面介紹過,你可以找到你的擴展的id,通過**Chrome://extensions**.ackaing里面介紹過。
**codebase**
屬性codebase是crx文件的url。
**version**
這個屬性被客戶端用來判斷是否真的要從codebase下載crx文件。這個值必須和crx文件的 manifest.json里面的版本參數吻合。
一個升級manifest xml文件可以包含多個擴展的信息,通過多個app標記。
## 測試
缺省的升級檢測頻率是每小時一次。你可以通過擴展頁面的現在立刻升級擴展來強制升級。
另外一種選擇是通過命令行參數--extensions-update-frequency來設置更加頻繁的升級間隔,單位秒。例如,每45秒檢測一次,你可以用這樣的命令行參數來運行chrome:
```
chrome.exe **--extensions-update-frequency=45**
```
注意這個將影響所有的已經安裝的擴展,因此請斟酌這樣做帶來的帶寬和服務器負載的影響。你可能想臨時卸載你所有的擴展除了正在調試的,在正常瀏覽器使用中不應該用這個選項來運行。
## 高級使用:請求參數
最基本的升級機制在服務端被設計的極其簡單,就是往web服務器-如apache上放就是一個靜態xml文件,然后升級這個xml文件如果你的擴展有新版本了。
高級開發者可能希望充分利用升級機制,通過往升級manifest url請求參數里面添加參數來識別擴展的id和版本,他們能使用運行在一個動態頁面來代替靜態xml以使用同一個url來控制所有的擴展的升級。
請求參數格式:
?x=<extension_data>
其中extension_data是一個編碼過的url字符串,其格式:
id=<id>&v=</id>
對于這個例子,說明我們有兩個已經安裝的擴展
Extension 1 with id "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" and version "1.1"
Extension 2 with id "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" and version "0.4"
兩個拓展都使用同一個update_url:http://test.com/extension_updates.php
兩個請求看起來像這樣:
http://test.com/extension_updates.php?x=id%3Daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa%26v%3D1.1
http://test.com/extension_updates.php?x=id%3Dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb%26v%3D0.4
在3.0.196.x之前的版本中有一個bug,地方在合并多個參數上。 ([http://crbug.com/17469](http://crbug.com/17469)).
### 將來的工作
雖然沒有實現,我們還是在一個獨立的請求列出多個擴展。對于上面的例子,這個請求看起來像這樣:
http://test.com/extension_updates.php?x=id%3Daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa%26v%3D1.1&x=id%3Dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb%26v%3D0.4
如果使用同一個update_url的擴展太多,導致請求的URL太長(超過1024字符),升級檢測將發起POST請求,同時把請求參數打包在POST里面。
## 高級使用:最小瀏覽器版本
隨著我們添加越來越多的api到擴展系統,你可能希望發布一個升級過的擴展,僅僅只允許運行在新版本的瀏覽器上。雖然chrome是自動升級的,但所有用戶升級到新版瀏覽器也需要很多天時間。為了確保一個指定的擴展升級只作用在特定的比較高的版本上,你可以添加**prodversionmin**到你的升級manifest文件里面的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>
```
這個配置確保只有運行在3.0.193.0以上的用戶才升級到2.0版本的擴展。
- 基礎文檔
- 綜述
- 調試
- 格式:Manifest文件
- 模式匹配
- 改變瀏覽器外觀
- Browser Actions
- Context Menus
- 桌面通知
- Omnibox
- Override替代頁
- Page Actions
- 主題
- 與瀏覽器交互
- 書簽
- Cookies
- chrome.devtools.* APIs
- Events
- chrome.history
- Management
- 標簽
- 視窗
- 實現擴展
- 無障礙性(a11y)
- 背景頁
- Content Scripts
- 跨域 XMLHttpRequest 請求
- 國際化 (i18n)
- 消息傳遞
- Optional Permissions
- NPAPI 插件
- 完成并發布應用
- 自動升級
- 托管
- 打包
- 規范和協議
- 應用設計規范
- 開發人員協議
- 免責聲明