google-chrome-extension - 为什么我的Chrome扩展程序本身无法自动更新?

标签 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

让我逐步引导您使代码重现:

$树

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

该扩展名实际上只是一个 list 文件。

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

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

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

让我们修改扩展名:
  • 在manifest.json中,将version设置为1.1(1.0的整数)。
  • 在updates.xml中,将version设置为1.1(而不是1.0)。
  • 使用与第一次相同的extention.pem文件重新打包扩展名。
  • 创建新的extension.crx文件。
  • 单击Tools-> Extensions-> Update extensions now

  • 人们会期望在Tools-> Extensions中看到扩展的版本号更改为1.1。

    相反,什么也没有发生。服务器收到对updates.xml的请求,但未收到extension.crx的请求。

    最佳答案

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

  • 我复制了您的设置,发现同样缺少更新。
  • 然后,我仅使用公用的Dropbox文件夹进行了第二次测试,一切正常。
  • 最后,我又进行了两个测试:一个测试将一个Node-hosted updates.xml指向一个Dropbox托管的文件,另一个测试将一个Dropbox-host updates.xml指向一个Node托管的crx文件。

  • 结果是,每当Node提供updates.xml时,Chrome都不会正确更新扩展名;当Dropbox托管updates.xml时,一切正常,无论是谁托管了crx文件。 (并且我确实更改了 list 中的update_url并为每次试用重建/上传了扩展名)。

    确切为什么会发生这种情况,对我来说仍然是一个很大的谜。这是我在Chrome中获取updates.xml时获得的HTTP响应 header (通常使用地址栏;我并没有模拟更新操作中的实际净流量):

    投寄箱:
    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端口进行更新?),我现在才发现,从我自己的Apache服务器在端口80上提供updates.xml和crx文件会导致损坏与使用Node观察到的问题相同。

    我希望我能为您提供一个实际的答案,但是也许您可以使用Dropbox进行一些测试,最后发现他们在做什么,这使Chrome像他们的更新文件一样有所不同。

    关于google-chrome-extension - 为什么我的Chrome扩展程序本身无法自动更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10343573/

    相关文章:

    css - iframe 不更新

    javascript - 运行 tabs.executeScript 时未选中 runtime.lastError?

    javascript - 无法通过 Chrome 扩展程序注入(inject) CSS

    javascript - 是否可以从弹出窗口更改 Chrome 扩展程序的设置?

    text-editor - Sublime Text 3 侧边栏自动更新不起作用

    google-chrome - Chrome 扩展程序多久自动更新一次?

    Android远程代码加载

    javascript - Chrome 扩展 : Detect which script created an iframe

    javascript - 如何等待直到元素存在?