# 自动升级
## 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.360.cn/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.360.cn/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 插件
- 完成并发布应用
- 自动升级
- 托管
- 打包
- 规范和协议
- 应用设计规范
- 开发人员协议
- 免责声明