【Chrome Extension】如何获取Extension的版本号

Chrome 中有两种扩展应用类型,一种是 Extension,它通过往页面中添加 script 脚本来达到其目的。另外一种是 Packaged Application,它是基于 Chrome 的本地应用。具体用法以后再总结。

这两种扩展都是需要用户手动安装的,也是可以自动更新的。但是有些时候,我们还是需要去检查 Extension 的版本。下面我们就看看如何去做?

首先,我们知道,在编写 Extension 时,我们都需要写一个manifest.json文件,它里面包含着关于这个 Extension 的信息。比如namedescriptionversion等很多信息。那么我就可以通过获取该文件来获取本扩展的版本。

那么如何获取manifest.json文件呢?

首先我们知道 Extension 中可以通过XMLHttpRequest来获取资源文件,而manifest.json也可以看做是普通的一个资源文件,那么我们就可以通过XMLHttpRequest获取manifest.json

1
2
3
4
5
6
7
8
9
10
11
(function() {
var url = 'manifest.json';
var xhr = new XMLHttpRequest();
xhr.onload = function() {
var manifest = JSON.parse(xhr.response);
var version = manifest.version;
// do something here
};
xhr.open('GET', url, true);
xhr.send();
})();

以上方法放在 Extension 的 content script 中,报如下错误:GET http://[ip]:[port]/manifest.json 404 (Not Found)。这个很容易理解,因为在 Extension 中,该脚本是通过 script 标签插入到 DOM 中执行的。那么我们如何来获取 manifest.json 的实际路径呢?答案是chrome.extension.getURL,这个 API 就是根据扩展中资源文件的相对路径来获取其绝对路径。而在 Packaged App 中则可以直接使用相对路径。所以在 Extension 中的做法是:

1
2
3
4
5
6
7
8
9
10
11
(function() {
var url = chrome.extension.getURL('manifest.json');
var xhr = new XMLHttpRequest();
xhr.onload = function() {
var manifest = JSON.parse(xhr.response);
var version = manifest.version;
// do something here
};
xhr.open('GET', url, true);
xhr.send();
})();

还要记住,我们需要在manifest.json中声明manifest.json是一种可以访问的资源。

1
2
3
{
"web_accessible_resources": ["manifest.json"]
}

否则我们会看到如下错误:

1
Denying load of chrome-extension://ongmmjdilaoifhglgibpinckpckeclch/manifest.json. Resources must be listed in the web_accessible_resources manifest key in order to be loaded by pages outside the extension.

以上我们把manifest.json当做一个普通的资源文件来访问。那么manifest.json作为一种很关键很通用(所有 Extension 中都有该文件)的一个配置文件,那么有没有更简单的方法呢?答案是肯定的。在最新的 Chrome(v22+)中提供了chrome.runtime.*API,他们提供了获取 background 页面,manifest.json 文件,以及和其他 Extension 通信的各种 API。代码如下:

1
2
3
var manifest = chrome.runtime.getManifest();
var version = manifest.version;
// do something here

很明显,直接使用chrome.runtime.getManifest来获取 Extension 的版本号,最为简单,代码少,还是同步的。

总结:文章总结了获取 Extension 版本号(在manifest.json中)的两种方法,一种把manifest.json当做普通资源文件访问,一种直接使用chrome.runtime.getManifest访问,后者更为简单易用。