2012-04-27 7 views
9

Tôi đã tạo một tiện ích chrome cơ bản thực sự và thiết lập máy chủ node.js đơn giản để kiểm tra tính năng tự động cập nhật. Máy chủ lưu trữ tệp .crx để tôi có thể cài đặt tiện ích mở rộng mà không gặp bất kỳ sự cố nào đơn giản bằng cách truy cập http://localhost:3000/clients/chrome/extension.crx. Nhưng khi tôi truy cập tools ->extensions và nhấp vào Update extensions now, tiện ích không tìm nạp phiên bản mới. Máy chủ không nhận được yêu cầu cho localhost:3000/clients/chrome/updates.xml, nhưng không nhận được bất kỳ yêu cầu nào cho tệp extensions.crx mới. Tôi làm gì sai ở đây?Tại sao tiện ích chrome của tôi không tự động cập nhật?


Hãy để tôi chỉ hướng dẫn bạn qua các mã để làm reproductible này:

$ cây

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

Phần mở rộng thực sự chỉ là một file manifest .

manifest.json

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

Như bạn thấy, tôi đề cập đến một update_url để tự động cập nhật càng tốt.

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> 

Bao bì phần mở rộng tạo extension.crxextension.pem.

Tôi cũng làm một máy chủ Node.js đơn giản để phục vụ các tập tin:

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

Ok, hãy kiểm tra điều này. Đầu tiên, khởi động server:

$ node web.js

Listening on 3000 

Cài đặt phần mở rộng bằng cách truy cập http://localhost:3000/clients/chrome/extension.crx. Phần này hoạt động hoàn hảo trong lần thử đầu tiên. Các máy chủ ghi lại yêu cầu:

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" 

Hãy sửa đổi phần mở rộng:

  1. Trong manifest.json, thiết version xuống còn 1,1 (intead của 1.0).
  2. Trong tệp updates.xml, đặt version thành 1.1 (thay vì 1.0).
  3. Đóng gói lại tiện ích mở rộng bằng cách sử dụng cùng một tệp extention.pem làm lần đầu tiên.
  4. Tệp extension.crx mới được tạo.
  5. Bấm vào Tools ->Extensions ->Update extensions now

Một mong chờ để thấy sự thay đổi số phiên bản của phần mở rộng xuống còn 1,1 trong Tools ->Extensions.

Thay vào đó, không có gì xảy ra. Máy chủ nhận được yêu cầu cho updates.xml nhưng không nhận được extension.crx.

Trả lời

2

Tôi nghĩ rằng lỗi nằm trong cách tệp web.js của bạn phục vụ updates.xml. Đây là lý do của tôi:

  • Tôi đã sao chép thiết lập của bạn và thấy thiếu sự cập nhật tương tự.
  • Sau đó, tôi đã làm bài kiểm tra thứ hai, chỉ sử dụng thư mục Dropbox công khai của tôi và mọi thứ diễn ra hoàn hảo.
  • Cuối cùng, tôi đã làm hai bài kiểm tra nữa: một với một Node-lưu trữ updates.xml trỏ đến một tập tin lưu trữ Dropbox, và một với một Dropbox-lưu trữ updates.xml trỏ đến một tập tin crx lưu trữ Node.

Kết quả là bất cứ khi nào updates.xml được phục vụ bởi Node, Chrome không cập nhật phần mở rộng một cách chính xác, và khi updates.xml được tổ chức bởi Dropbox, tất cả mọi thứ khi tốt, bất kể ai đã tổ chức tệp crx. (Và tôi đã thay đổi update_url trong tệp kê khai và xây dựng lại/tải lên tiện ích mở rộng cho mỗi lần dùng thử).

Chính xác tại sao điều này xảy ra vẫn là một bí ẩn khá lớn đối với tôi. Dưới đây là các tiêu đề HTTP response tôi nhận được khi tôi lấy updates.xml trong Chrome (bình thường, bằng cách sử dụng thanh địa chỉ; Tôi không kiểm tra lưu lượng thuần túy thực tế từ các hoạt động cập nhật, chỉ cần mô phỏng nó):

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 

tôi cũng nghĩ rằng nó có thể là một vấn đề với cổng (có lẽ Chrome không muốn cập nhật từ phi 80-po rts?), và tôi vừa phát hiện ra rằng việc phục vụ updates.xml và tệp crx từ máy chủ Apache của riêng tôi trên cổng 80 gây ra sự cố giống hệt với vấn đề được quan sát với Nút.

Tôi ước tôi có câu trả lời thực sự cho bạn, nhưng có thể bạn có thể chạy một số thử nghiệm với Dropbox và cuối cùng khám phá những gì họ đang làm khác nhau khiến Chrome thích tệp cập nhật của họ.

+0

Ít nhất thành công của tôi với Dropbox quy định khả năng HTTPS HTTPS được thi hành không có giấy tờ yêu cầu, đó là một trong những dự đoán trước đây của tôi, vì Dropbox hoạt động tốt như nhau qua HTTP và HTTPS. – apsillers

+0

Đó là điều kỳ lạ nhất: Tôi sắp thử điều này với nhiều tiêu đề khác nhau và xem sự khác biệt của nó là gì, nhưng sau đó, nó chỉ làm việc trong lần thử đầu tiên mà không sửa đổi ... Tôi sẽ đăng lại nếu tôi tìm hiểu Tôi hơi say trong nỗ lực đầu tiên .. – Shawn

+0

Lý thuyết duy nhất khác của tôi là tệp 1.1 CRX cần được đặt tên khác với tệp 1.0 gốc? Đó là điều duy nhất tôi có thể nghĩ rằng tôi đã không kiểm tra và có thể đã làm khác trong các bài kiểm tra của tôi. – apsillers

1

Vì nó nhận được XML của bạn và không cập nhật phần mở rộng, nó không giống như một cái gì đó trong bản cập nhật xml của bạn. Đoán tốt nhất của tôi là 'appid' của bạn không khớp với ID ứng dụng của Tiện ích mở rộng đã cài đặt. Trên trang chrome: // extensions xem 'ID' của tiện ích mở rộng được cài đặt và xác minh rằng giá trị đó khớp với những gì có trong update.xml

+0

Trên thực tế vấn đề đã biến mất mà không có tôi thay đổi bất cứ điều gì (mà tôi biết). Nói cách khác, tôi đã giải quyết nó nhưng tôi không biết làm thế nào. Lý thuyết của bạn có ý nghĩa hoàn hảo, nhưng tôi không nhớ đã thay đổi appid nên tôi không thể xác nhận ... – Shawn