为什么我的chrome扩展程序不能自动更新?

Sha*_*awn 9 auto-update google-chrome-extension

我做了一个非常基本的chrome扩展,并设置了一个简单的node.js服务器来测试自动更新功能.服务器托管.crx文件,这样我只需访问就可以毫无困难地安装扩展程序http://localhost:3000/clients/chrome/extension.crx.但是当我转到tools- > extensions并单击时Update extensions now,扩展程序不会获取新版本.服务器确实收到请求localhost:3000/clients/chrome/updates.xml,但没有收到任何新的extension.crx文件请求.我在这做错了什么?


让我告诉您完成代码以使其可重现:

$ tree

.
|-- clients
|   `-- chrome
|       |-- extension
|       |   `-- manifest.json
|       |-- extension.crx
|       |-- extension.pem
|       `-- updates.xml
`-- web.js
Run Code Online (Sandbox Code Playgroud)

扩展名实际上只是一个清单文件.

的manifest.json

{
  "name": "testing auto-updates",
  "version": "1.0",
  "update_url": "http://localhost:3000/clients/chrome/updates.xml"
 }
Run Code Online (Sandbox Code Playgroud)

如您所见,我指的是update_url以使自动更新成为可能.

updates.xml

<?xml version='1.0' encoding='UTF-8'?>
<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>
  <app appid='fkphbmkcjefhhnnlhhjlnkellidponel'>
    <updatecheck codebase='http://localhost:3000/clients/chrome/extension.crx' version='1.0' />
  </app>
</gupdate>
Run Code Online (Sandbox Code Playgroud)

打包扩展名会创建extension.crxextension.pem.

我还制作了一个简单的node.js服务器来提供文件:

web.js

var express = require('express');

var app = express.createServer(express.logger());

/* ROUTES */

app.get('/clients/chrome/extension.crx', function(request, response)
{
    response.contentType('application/x-chrome-extension');
    response.sendfile('clients/chrome/extension.crx');
});

app.get('/clients/chrome/updates.xml', function(request, response)
{
    response.sendfile('clients/chrome/updates.xml');
});

/* ROUTES END */

var port = process.env.PORT || 3000;

app.listen(port, function() {
  console.log("Listening on " + port);
});
Run Code Online (Sandbox Code Playgroud)

好吧,让我们测试一下.首先,启动服务器:

$ node web.js

Listening on 3000
Run Code Online (Sandbox Code Playgroud)

通过访问http:// localhost:3000/clients/chrome/extension.crx安装扩展.这部分在第一次尝试时完美运行.服务器记录请求:

127.0.0.1 - - [Thu, 26 Apr 2012 22:25:47 GMT] "GET /clients/chrome/extension.crx HTTP/1.1" 304 - "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.19 (KHTML, like Gecko) Ubuntu/11.10 Chromium/18.0.1025.151 Chrome/18.0.1025.151 Safari/535.19"
Run Code Online (Sandbox Code Playgroud)

我们来修改扩展名:

  1. 在manifest.json中,设置version为1.1(intead为1.0).
  2. 在updates.xml中,设置version为1.1(而不是1.0).
  3. 使用与extention.pem第一次相同的文件重新打包扩展.
  4. extension.crx文件已创建.
  5. 单击Tools- > Extensions- >Update extensions now

人们可能会看到扩展的版本号在Tools- >中变为1.1 Extensions.

相反,没有任何反应.服务器收到请求updates.xml但不是extension.crx.

aps*_*ers 2

我认为错误在于您的 web.js 文件的服务方式updates.xml。这是我的推理:

  • 我复制了你的设置,发现同样缺乏更新。
  • 然后我进行了第二次测试,仅使用我的公共 Dropbox 文件夹,一切都很顺利。
  • 最后,我又做了两项测试:一项是 Node 托管的updates.xml指向 Dropbox 托管的文件,另一项是 Dropbox 托管的updates.xml指向 Node 托管的 crx 文件。

结果是,每当updates.xml由 Node 提供服务时,Chrome 都不会正确更新扩展,而当updates.xml由 Dropbox 托管时,一切都很好,无论谁托管 crx 文件。(我确实改变了update_url清单中的内容并为每次试验重新构建/上传了扩展)。

到底为什么会发生这种情况对我来说仍然是一个很大的谜。以下是我updates.xml在 Chrome 中获取时得到的 HTTP 响应标头(通常使用地址栏;我不会从更新操作中嗅探实际的网络流量,只是模拟它):

Dropbox:

HTTP/1.1 200 OK
Server: nginx/1.0.14
Date: ...
Content-Type: application/xml
Transfer-Encoding: chunked
Connection: keep-alive
x-robots-tag: noindex,nofollow
etag: ...
pragma: public
cache-control: max-age=0
Content-Encoding: gzip
Run Code Online (Sandbox Code Playgroud)

节点.js:

HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: application/xml
Date: ...
Cache-Control: public, max-age=0
Last-Modified: ...
ETag: "..."
Accept-Ranges: bytes
Content-Length: 284
Connection: keep-alive
Run Code Online (Sandbox Code Playgroud)

我还认为这可能是端口的问题(也许 Chrome 不喜欢从非 80 端口更新?),我现在刚刚发现服务updates.xml我自己的 Apache 服务器在端口 80 上的服务和 crx 文件会导致相同的损坏到 Node.js 中观察到的问题。

我希望我能为您提供一个实际的答案,但也许您可以使用 Dropbox 运行一些测试,最终发现他们所做的不同之处使得 Chrome 喜欢他们的更新文件。