9

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


代码

让我引导您完成代码以使其可重现:

$树

.
|-- clients
|   `-- chrome
|       |-- extension
|       |   `-- manifest.json
|       |-- extension.crx
|       |-- extension.pem
|       `-- updates.xml
`-- web.js

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

清单.json

{
  "name": "testing auto-updates",
  "version": "1.0",
  "update_url": "http://localhost:3000/clients/chrome/updates.xml"
 }

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

更新.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>

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

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

网页.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);
});

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

$ 节点 web.js

Listening on 3000

通过访问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"

让我们修改扩展名:

  1. 在 manifest.json 中,设置version为 1.1(而不是 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

4

2 回答 2

2

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

  • 我复制了您的设置,发现同样缺少更新。
  • 然后我进行了第二次测试,只使用了我的公共 Dropbox 文件夹,一切都很顺利。
  • 最后,我又做了两个测试:一个是 Node-hostedupdates.xml指向 Dropbox-hosted 文件,另一个是 Dropbox-hostedupdates.xml指向一个 Node-hosted crx 文件。

结果是,无论何时updates.xml由 Node 提供服务,Chrome 都没有正确更新扩展程序,而当updates.xml由 Dropbox 托管时,一切正常,无论是谁托管 crx 文件。(而且我确实更改了update_url清单中的 并为每次试用重新构建/上传了扩展)。

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

保管箱:

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

节点.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

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

我希望我有一个实际的答案给你,但也许你可以用 Dropbox 运行一些测试,最后发现他们做了什么不同的事情,使 Chrome 像他们的更新文件一样。

于 2012-04-30T06:09:41.127 回答
1

由于它获取您的 XML 并且不更新扩展名,因此它可能不喜欢您的更新 xml 中的某些内容。我最好的猜测是您的“appid”与已安装扩展的 App ID 不匹配。在页面 chrome://extensions 查看已安装扩展的“ID”并验证该值是否与 update.xml 中的值匹配

于 2012-05-03T12:19:37.680 回答