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 を参照しています。

update.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"

拡張子を変更しましょう:

  1. manifest.json で、version1.1 に設定します (1.0 の代わりに)。
  2. updates.xml で、version(1.0 ではなく) 1.1 に設定します。
  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 フォルダのみを使用して 2 回目のテストを行ったところ、すべてが完璧に機能しました。
  • 最後に、さらに 2 つのテストをupdates.xml実行しましupdates.xmlた。

その結果updates.xml、Node によって提供されたときはいつでも、Chrome は拡張機能を正しく更新しませんでした。また、updates.xmlDropbox によってホストされていたときは、誰が 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

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ポート 80 で自分の Apache サーバーから crx ファイルを提供すると、同一の破損が発生することがわかりました。ノードで観察された問題に。

実際の回答があればよかったのですが、Dropbox でいくつかのテストを実行して、Chrome が更新ファイルのように機能している違いを最終的に発見できるかもしれません。

于 2012-04-30T06:09:41.127 に答える
1

XMLを取得し、拡張機能を更新しないため、おそらく更新xml内の何かが気に入らないでしょう。私の推測では、「appid」はインストールされている拡張機能のアプリIDと一致しません。ページchrome:// extendedsで、インストールされている拡張機能の「ID」を表示し、その値がupdate.xmlにあるものと一致することを確認します

于 2012-05-03T12:19:37.680 に答える