23

顧客からの機能要求を尊重しようとしているのですが、インターネットが利用可能な場合、新しいバージョンが利用可能かどうか、アプリケーションで Web サイトを確認してください。

問題は、サーバー側で何をする必要があるのか​​ わからないことです。

私のアプリケーション (Qt を使用して C++ で開発されたもの) がリクエスト (HTTP ?) をサーバーに送信する必要があると想像できますが、このリクエストに何が応答するのでしょうか? ファイアウォールを通過するには、ポート 80 を使用する必要があると思いますか? これは正しいです ?

または、そのような機能を使用するには、ネットワーク管理者に、通信に使用する特定のポート番号を開くように依頼する必要がありますか?


@ pilif : 詳細な回答をありがとうございます。私にはまだ不明なことがあります:

お気に入り

http://www.example.com/update?version=1.2.4

次に、必要なものを返すことができます。おそらく、新しいバージョンのインストーラーのダウンロード URL も返すことができます。

どうすれば返品できますか? それはphpまたはaspページになりますか(私はPHPもASPについても何も知りません。告白しなければなりません)??version=1.2.4それに応じて何かを返すために、その部分をデコードするにはどうすればよいですか?

4

12 に答える 12

38

Web サイトに対して単純な HTTP リクエストを実行することを強くお勧めします。それ以外はすべて失敗する運命にあります。

ローカル アプリケーションのバージョンを含むサイトの特定のページに HTTP GET リクエストを送信します。

お気に入り

http://www.example.com/update?version=1.2.4

次に、必要なものを返すことができます。おそらく、新しいバージョンのインストーラーのダウンロード URL も返すことができます。

最新バージョンの静的ファイルをサーバーに置いて、クライアントに決定させてみませんか? プロセスを制御したい(または必要とする)可能性があるためです。1.2 は将来サーバーと互換性がなくなる可能性があるため、サーバーに 1.3 への更新を強制する必要がありますが、1.2.4 から 1.2.6 への更新は重要ではない可能性があるため、クライアントにオプションの更新。

または、インストール ベースの内訳が必要です。

または何でも。通常、サーバーはユーザーが最終的に制御できるものであるため、できるだけ多くのインテリジェンスをサーバーに保持することが最善であることを学びました。

この分野での経験が少しあるので、何が問題になる可能性があるか (そして私を信じてください) の小さなプレビューを次に示します。

  • アプリケーションは、そこにあるさまざまなパーソナル ファイアウォール アプリケーションによって HTTP 要求を作成できなくなります。
  • かなりの割合のユーザーが、実際に更新プロセスを開始するために必要なアクセス許可を持っていません。
  • ユーザーがパーソナル ファイアウォールを通過して古いバージョンを許可している場合でも、.EXE が変更されているため、このツールはエラーを表示し、ユーザーに新しい exe の接続を許可しないように勧めます (ユーザーは通常、ここでセキュリティ ツールの希望に従います)。 .
  • 管理された環境では、Web から実行可能なコンテンツを読み込んで実際に実行したために、(必ずしもこの順序でなくても) 撃たれて絞首刑に処せられます。

そのため、被害を最小限に抑えるために、

  • 更新サーバーに接続できない場合、黙って失敗します
  • 更新する前に、インストール ディレクトリへの書き込み権限があることを確認し、そうでない場合、またはまったく更新しない場合はユーザーに警告します。
  • 管理者が自動更新をオフにする方法を提供します。

あなたがやろうとしていることをするのは楽しいことではありません - 特に、私が何度もしなければならなかったように、技術に傾倒していないユーザーを扱う場合はなおさらです。

于 2008-09-11T12:29:19.823 に答える
21

ピリフの答えは良かったし、私もこれについてたくさんの経験がありますが、もっと何かを追加したいと思います:

yourapp.exeを起動すると、「アップデータ」がyourapp.exeを最新バージョンで上書きしようとすることに注意してください。オペレーティングシステムとプログラミング環境によっては(C ++ / QTについて言及しましたが、私はそれらの経験がありません)、使用中のため、 yourapp.exeを上書きすることはできません

私がやったことは、ランチャーを作成することです。構成ファイル(xml、非常に単純)を使用して「実際のexe」を起動するMyAppLauncher.exeがあります。新しいバージョンが存在する場合、ランチャーは使用されていないため「実際のexe」を更新してから、新しいバージョンを再起動できます。

それを覚えておけば安全です。

于 2008-09-11T12:40:23.980 に答える
7

マーティン、

もちろん、あなたは絶対に正しいです。しかし、私はランチャーをインストーラーと一緒に提供します。または、インストーラーをダウンロードして起動し、できるだけ早く終了します。その理由は、ランチャーのバグです。更新できない(または最初のドロップに含めるのを忘れた)コンポーネントに依存することは決してありません。

したがって、アプリケーションの更新プロセスで配布するペイロードは、単なる標準インストーラーですが、重要なUIはありません。クライアントは、インストーラーが正常に実行される可能性があることを確認し、アップデーターをダウンロードすると、それを実行して終了します。

アップデータは実行され、ペイロードを元のインストールディレクトリにインストールし、(できれば更新された)アプリケーションを再起動します。

それでも:プロセスは煩雑であり、アプリケーションの使用法が広い場合は、Windowsプラットフォームに自動更新機能を実装する前によく考えてください。

于 2008-09-11T12:48:11.387 に答える
6

PHPでは、事は簡単です:

<?php
    if (version_compare($_GET['version'], "1.4.0") < 0){
        echo "http://www.example.com/update.exe";
    }else{
        echo "no update";
    }
?>

もちろん、これを拡張して、現在利用可能なバージョンがスクリプト内にハードコードされないようにすることもできますが、これは要点を説明するだけです。

アプリケーションには、次の疑似コードがあります。

result = makeHTTPRequest("http://www.example.com/update?version=" + getExeVersion());
if result != "no update" then
    updater = downloadUpdater(result);
    ShellExecute(updater);
    ExitApplication;
end;

PHP スクリプトが返す可能性のあるものを指定して、「プロトコル」を自由に拡張して、それが重要で必須の更新であるかどうかをクライアントに伝えてください。

または、ユーザーに表示するテキストを追加することもできます。変更内容に関する情報が含まれている可能性があります。

あなたの可能性は無限大です。

于 2008-09-11T16:06:49.880 に答える
4

Qt アプリは QHttp を使用して、最新のバージョン番号を含む小さな XML ファイルを Web サイトから読み取ります。これが現在のバージョン番号より大きい場合は、ダウンロード ページに移動するオプションが表示されます。とてもシンプルです。正常に動作します。

于 2008-09-13T14:37:34.133 に答える
2

@Martin と @Pilif の回答には同意しますが、追加します。

実際に更新プログラムをインストールしてからインストールするか、プログラムの使用が終了するまで更新プログラムのインストールを遅らせるかをエンド ユーザーが決定できるようにすることを検討してください。

あなたのアプリの目的/機能はわかりませんが、ユーザーがそこで何か特定のことをする必要があるときに多くのアプリケーションが起動され、その後、アプリを起動して新しいバージョンが見つかったと言われることほど面倒なことはありません。ダウンロードが完了するのを待ち、アプリをシャットダウンして再起動します。プログラムに更新される可能性のある他のリソース (参照ファイル、データベースなど) がある場合、問題はさらに悪化します。

私たちは約 400 のショップで EPOS システムを稼働させていましたが、最初は、プログラムに更新プログラムを見つけてダウンロードさせるのは素晴らしいことだと考えていました (上記の提案と非常によく似たバージョン番号を含むファイルを使用して)... 素晴らしいアイデアです。 . すべてのショップがほぼ同時にシステムを起動するまで (午前 8 時 45 分~午前 8 時 50 分)、400 台のリモート サーバーに 20 MB 以上のダウンロードを提供するサーバーがヒットし、ローカル ソフトウェアが更新されて、再起動。カオス - 約 10 分間、誰も取引できなくなります。

言うまでもなく、これにより、その後「更新の確認」機能をオフにし、ショップがその日の後半まで更新を「遅らせる」ことができるように再設計しました. :-)

編集: そして、ADOBE の誰かが読んでいる場合 - 神のために、私がドキュメントを読むために起動したいだけなのに、なぜいまいましいアクロバット リーダーがアップデートをダウンロードしようと主張し、がらくたをするのですか? PDFを読みたいたびに更新を探すために私の人生のさらに20〜30秒を無駄にすることなく、起動が十分に遅く、十分に肥大化していませんか?
彼らは独自のソフトウェアを使用していませんか??!!! :-)

于 2008-09-11T13:32:50.593 に答える
1

サーバー上には、最新バージョンのバージョン番号 (および場合によってはダウンロード URL) を含む単純なファイル "latestversion.txt" を作成できます。次に、クライアントは単純な HTTP リクエスト (ポート 80 に対して) を使用してこのファイルを読み取り、http://your.web.site/latestversion.txtを取得する必要があります。これを解析してバージョン番号を取得できます。この方法では、手の込んだサーバー コードは必要ありません。既存の Web サイトに単純なファイルを追加するだけです。

于 2008-09-11T12:26:45.277 に答える
1

ファイルを example.com の更新ディレクトリに保持している場合、前述の要求に応じて、この PHP スクリプトでファイルをダウンロードする必要があります。(アップデートは yourprogram.1.2.4.exe になります

$version = $_GET['version'];    
$filename = "yourprogram" . $version . ".exe";
$filesize = filesize($filename);
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: post-check=0, pre-check=0");
header("Content-type: application-download");
header('Content-Length: ' . $filesize);
header('Content-Disposition: attachment; filename="' . basename($filename).'"');
header("Content-Transfer-Encoding: binary");

これにより、Web ブラウザーはアプリケーションをダウンロードしていると認識します。

于 2008-09-11T13:54:27.483 に答える
0

これを実現する最も簡単な方法は、libcurlなどのライブラリを使用して HTTP 要求を起動し、オンライン バージョンを含む ini または xml ファイルをダウンロードさせ、新しいバージョンをオンラインで入手できるようにすることです。

xml ファイルを解析した後、新しいバージョンが必要かどうかを判断し、新しいバージョンを libcurl でダウンロードしてインストールできます。

于 2008-09-11T12:24:53.470 に答える
0

最新バージョンのバージョン番号と、新しいバージョンをダウンロードするための URL を含む (XML) ファイルをサーバーに配置するだけです。その後、アプリケーションは XML ファイルを要求し、バージョンが独自のものと異なるかどうかを調べ、それに応じてアクションを実行できます。

于 2008-09-11T12:25:02.410 に答える
0

サーバー上の単純な XML ファイルは、バージョン チェックのみを目的として十分であると思います。

その場合、サーバーに ftp アカウントと、新しいバージョンをビルドした後に ftp 経由でファイルを送信できるシステムを構築するだけで済みます。そのビルド システムは、インストール ファイル/zip を Web サイトに直接配置することさえできます。

于 2008-09-11T12:26:08.477 に答える
0

本当に基本的なものにしたい場合は、整数のバージョン番号を含む version.txt を Web サーバーにアップロードするだけです。ダウンロードした最新の version.txt に対してそのチェックをダウンロードし、msi またはセットアップ パッケージをダウンロードして実行します。

より高度なバージョンでは、rss、xml などを使用します。サードパーティのライブラリを使用して RSS を解析するのが最善です。必要に応じて、変更に関してユーザーに表示される情報を含めることができます。

基本的に、単純なダウンロード機能が必要です。

どちらのソリューションでも、クライアント側から発信するポート 80 にアクセスするだけで済みます。これには通常、ファイアウォールやネットワーク (クライアント側) を変更する必要はなく、インターネットに接続する Web サーバー (Web ホスティング、コロケーション、または独自のサーバー - すべてここで動作します) が必要です。

利用可能な商用自動更新ソリューションがいくつかあります。Click-OnceとUpdater Application Blockを使用した.net側での経験しかないため、それらの推奨事項は他の回答者に任せます(後者はもう継続されていません)。

于 2008-09-11T12:27:37.737 に答える