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

时间:2012-04-27 01:18:51

标签: google-chrome-extension auto-update

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


CODE

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

$ tree

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

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

的manifest.json

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

如您所见,我指的是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>

打包扩展程序会创建 extension.crx extension.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);
});

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

$ node 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(intead为1.0)。
  2. 在updates.xml中,将version设置为1.1(而不是1.0)。
  3. 使用与第一次相同的extention.pem文件重新打包扩展程序。
  4. 创建了新的extension.crx文件。
  5. 点击Tools - &gt; Extensions - &gt; Update extensions now
  6. 人们可能会看到Tools - &gt; Extensions中扩展程序的版本号更改为1.1。

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

2 个答案:

答案 0 :(得分:2)

我认为错误在于您的web.js文件如何服务updates.xml。这是我的理由:

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

结果是,只要Node提供了updates.xml,Chrome就无法正确更新扩展程序,而当Dropbox托管updates.xml时,一切正常,无论是谁托管了crx文件。 (我确实更改了清单中的update_url并重新/上传了每个试用版的扩展名。)

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

升降梭箱:

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

<强> Node.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和crx文件端口80上的Apache服务器导致与Node观察到的问题相同的破坏。

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

答案 1 :(得分:1)

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