2012-04-27 109 views
9

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


CODE

让我带你通过代码来使这个reproductible:

$树

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

好吧,让我们来测试这一点。首先,启动服务器:

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

回答

2

我认为错误在于你web.js文件如何提供updates.xml。这是我的推理:

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

结果是,每当updates.xml由节点提供服务,Chrome未正确更新扩展,当updates.xml被Dropbox的,一切都很好,当,无论谁主办的CRX档案托管。 (而且我确实更改了清单中的update_url,并为每个试验重建/上传了扩展名)。

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

的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 

的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 PO更新rts?),现在我刚刚发现服务于updates.xml和端口80上的我自己的Apache服务器上的crx文件导致破坏与Node中观察到的问题相同。

我希望我有一个实际的答案,但也许你可以运行一些测试与Dropbox和最后发现他们在做什么不同,使得浏览器像他们的更新文件。

+0

至少我与Dropbox的成功排除了一个未公开的镀铬强制HTTPS的可能性要求,这是我早先的猜测之一,因为Dropbox在HTTP和HTTPS上工作得很好。 – apsillers 2012-04-30 06:15:06

+0

这是最奇怪的事情:我正准备尝试使用各种标题,看看它有什么不同,但是第一次尝试的时候没有任何修改......我会回复,如果我找到了什么我在第一次尝试中搞砸了。 – Shawn 2012-05-02 00:13:45

+0

我唯一的其他理论是1.1 CRX文件需要命名与原始1.0文件不同的东西吗?这是我能想到的唯一的事情,我没有检查,可能在我的测试中做了不同的处理。 – apsillers 2012-05-03 21:21:50

1

因为它得到您的XML并且不更新它不喜欢的可能是你更新XML东西延伸。我最好的猜测是你的'appid'与安装的扩展名的App ID不匹配。在页面铬://扩展查看已安装的扩展的“ID”,并验证值相匹配的是在update.xml

+0

事实上,没有我改变任何东西(我知道),问题就消失了。换句话说,我解决了它,但我不知道如何。你的理论很明显,但我不记得改变appid,所以我不能确认... – Shawn 2012-05-03 20:57:59

相关问题