アプリケーションの新しいバージョンを自動的にチェックする

StackOverflow https://stackoverflow.com/questions/56391

  •  09-06-2019
  •  | 
  •  

質問

お客様からの機能リクエストを尊重したいと考えており、インターネットが利用可能な場合、アプリケーションで新しいバージョンが利用可能かどうかを Web サイトで確認したいと考えています。

問題は、サーバー側で何をしなければならないのかがわからないことです。

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

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


@ピリフ :詳細な回答をありがとうございます。私にとってまだ不明な点があります:

のように

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

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

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

役に立ちましたか?

解決

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 から実行可能コンテンツをロードして実際に実行すると、銃殺され、絞首刑に処せられます (この順序は必ずしも必要ではありません)。

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

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

これからやろうとしていることをするのは楽しくありません。特に、私が何度も経験したように、技術に興味のないユーザーを相手にする場合はそうです。

他のヒント

ピリフの答えは素晴らしく、私もこれに関して多くの経験がありますが、さらに何かを追加したいと思います。

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

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

これだけ覚えておけば安全です。

マーティン、

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

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

その後、アップデーターが実行され、そのペイロードが元のインストール ディレクトリにインストールされ、(更新された可能性がある) アプリケーションが再起動されます。

まだ:このプロセスは複雑なので、アプリケーションの使用目的が広範囲に及ぶ場合は、Windows プラットフォームに自動更新機能を実装する前によく考えたほうがよいでしょう。

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 スクリプトが返すものを指定することで、「プロトコル」を自由に拡張できます。

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

あなたの可能性はまったく無限です。

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

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

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

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

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

言うまでもなく、これにより私たちはその後「アップデートのチェック」機能をオフにし、ショップがその日の遅い時間までアップデートを「遅らせる」ことができるように再設計しました。:-)

編集:そして、ADOBE の誰かが読んでいるとしたら、一体なぜ、私がただ文書を読みたいだけなのに、このアクロバット リーダーはアップデートやクソをダウンロードしようとするのでしょうか?PDF を読みたいたびに更新情報を探してさらに 20 ~ 30 秒を無駄にせずに、起動が遅くなり、このままでも十分に肥大化しませんか?
彼らは独自のソフトウェアを使用していないのですか??!!! :-)

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

ファイルを 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 ブラウザはアプリケーションをダウンロードしていると認識します。

これを実現する最も簡単な方法は、次のようなライブラリを使用して HTTP リクエストを発行することです。 リブカール オンライン バージョンと新しいバージョンがオンラインで入手できる場所を含む ini または xml ファイルをダウンロードさせます。

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

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

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

必要なのはサーバー上の FTP アカウントだけであり、新しいバージョンの構築後に FTP 経由でファイルを送信できるシステムを構築できます。このビルド システムでは、インストール ファイル/zip を Web サイトに直接配置することもできます。

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

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

基本的に必要なのは単純なダウンロード機能だけです。

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

商用の自動更新ソリューションがいくつか利用可能です。私は .net 側で Click-Once と Updater Application Block の経験しかないため、これらに関する推奨事項は他の回答者に任せます (後者についてはこれ以上続行しません)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top