自动检查我的应用程序的新版本

时间:2008-09-11 12:17:51

标签: c++ qt

为了兑现我们客户的功能请求,我希望我的应用程序在互联网可用时,如果有新版本,请查看我们的网站。

问题在于我不知道在服务器端需要做什么。

我可以想象我的应用程序(使用Qt在C ++中开发)必须向服务器发送请求(HTTP?),但是这个请求会响应什么?为了通过防火墙,我想我将不得不使用端口80?这是对的吗?

或者,对于这样的功能,我是否必须要求我们的网络管理员打开我将要通信的特定端口号?


@ pilif:谢谢你的详细解答。还有一些事情我不清楚:

  

     

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

     

然后你可以返回你想要的东西,也可能是新版本安装程序的下载URL。

我该如何归还?它会是一个php或asp页面(我对PHP和ASP一无所知,我不得不承认)?如何解码?version=1.2.4部分以便相应地返回内容?

12 个答案:

答案 0 :(得分:38)

我绝对建议您只对您的网站发送一个简单的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上加载可执行内容,然后实际执行它。

为了尽可能降低伤害,

  • 无法连接到更新服务器时无提示失败
  • 在更新之前,请确保您对安装目录具有写入权限,如果不这样做,则警告用户,或者根本不进行更新。
  • 为管理员提供关闭自动更新的方法。

做你将要做的事情并不好玩 - 尤其是当你与非技术倾向的用户打交道时,我已经无数次了。

答案 1 :(得分:21)

Pilif答案很好,我也有很多经验,但我想补充一点:

请记住,如果启动yourapp.exe,则“updater”将尝试使用最新版本覆盖yourapp.exe。根据您的操作系统和编程环境(您已经提到C ++ / QT,我没有这些经验),您能够覆盖 yourapp.exe ,因为它将被使用。

我所做的就是创建一个启动器。我有一个MyAppLauncher.exe使用配置文件(xml,非常简单)来启动“真正的exe”。如果存在新版本,Launcher可以更新“真正的exe”,因为它没有被使用,然后重新启动新版本。

请记住这一点,你就会安全。

答案 2 :(得分:7)

马丁,

你当然是对的。但我会用安装程序交付启动器。或者只需下载安装程序,启动它并尽快退出。原因是发射器中的错误。您永远不会想要依赖于您无法更新的组件(或忘记包含在初始删除中)。

因此,我随应用程序更新过程分发的有效负载只是标准安装程序,但没有任何重要的UI。一旦客户端检查到安装程序有成功运行的机会,并且一旦下载了更新程序,它就会运行并自行退出。

updater比运行更新,将其有效负载安装到原始安装目录中并重新启动(希望更新的)应用程序。

仍然:这个过程非常繁琐,当您的应用程序广泛使用时,您最好在Windows平台上实现自动更新功能之前再三考虑。

答案 3 :(得分:5)

在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脚本可以返回的内容来随意扩展“协议”,以告诉客户端它是否是重要的强制更新。

或者您可以添加一些文本以显示给用户 - 可能包含有关更改内容的一些信息。

你的可能性是无限的。

答案 4 :(得分:4)

我的Qt应用程序只使用QHttp从我的网站上读取包含最新版本号的微小XML文件。如果这大于当前版本号,则可以选择转到下载页面。非常简单。工作正常。

答案 5 :(得分:2)

我同意@Martin和@Pilif的回答,但添加;

考虑允许最终用户决定是否要在那里实际安装更新,或者延迟安装更新,直到他们使用完程序。

我不知道您的应用程序的目的/功能,但是当用户需要在那里执行某些特定操作时启动许多应用程序 - 没有比启动应用程序然后被告知它找到新版本更令人讨厌的事情,并且您必须等待它下载,关闭应用程序并重新启动自己。如果您的程序有其他可能更新的资源(参考文件,数据库等),则问题会变得更糟。

我们在大约400家商店运行了EPOS系统,最初我们认为让程序现场更新并下载它们会很棒(使用包含与上述建议非常相似的版本号的文件)。 。 很好的主意。直到所有商店大约在同一时间启动他们的系统(8:45-8:50),我们的服务器被命中为200个Mb下载到400个远程服务器,然后更新本地软件并导致重新开始。混乱 - 没有人能够交易大约10分钟。

毋庸置疑,这导致我们随后关闭“检查更新”功能并重新设计它以允许商店“延迟”更新,直到当天晚些时候。 : - )

编辑:如果ADOBE的任何人正在阅读 - 为了上帝的缘故,为什么该死的acrobat读者坚持试图下载更新和废话,当我只是想要开始阅读文档?启动时是否足够缓慢,并且不够臃肿,而且每次我想要阅读PDF时都不会再浪费20-30秒的时间来寻找更新? 不要使用他们自己的软件?? !!! : - )

答案 6 :(得分:1)

在服务器上你可以有一个简单的文件“latestversion.txt”,其中包含最新版本的版本号(也许是下载URL)。然后客户端只需要使用简单的HTTP请求(是的,到端口80)来读取此文件以检索http://your.web.site/latestversion.txt,然后您可以解析该文件来获取版本号。这样您就不需要任何花哨的服务器代码 - 您只需要在现有网站上添加一个简单的文件。

答案 7 :(得分: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");

这使您的网络浏览器认为它正在下载应用程序。

答案 8 :(得分:0)

实现此目标的最简单方法是使用libcurl之类的库触发HTTP请求,并使其下载包含在线版本的ini或xml文件,并在线提供新版本。< / p>

解析xml文件后,您可以确定是否需要新版本并使用libcurl下载新版本并安装它。

答案 9 :(得分:0)

只需在服务器上放置一个(XML)文件,其中包含最新版本的版本号,以及从中下载新版本的URL。然后,您的应用程序可以请求XML文件,查看版本是否与其自身不同,并采取相应的操作。

答案 10 :(得分:0)

我认为服务器上的简单XML文件仅用于版本检查。

您的服务器上只需要一个ftp帐户,并且构建系统能够在构建新版本后通过ftp发送文件。该构建系统甚至可以直接在您的网站上安装文件/ zip!

答案 11 :(得分:0)

如果你想保持它基本,只需将version.txt上传到包含整数版本号的网络服务器。根据您下载的最新版本.txt下载该检查,然后只需下载msi或安装程序包并运行它。

更高级的版本将使用rss,xml或类似版本。最好使用第三方库来解析rss,如果您愿意,可以包含向用户显示的有关更改的信息。

基本上你只需要简单的下载功能。

这两种解决方案都只需要您访问从客户端传出的端口80。这通常不需要对防火墙或网络进行任何更改(在客户端),您只需要一个面向互联网的Web服务器(网络托管,主机托管或您自己的服务器 - 所有这些都可以在这里工作)。

有几种商业自动更新解决方案可供选择。我会把这些建议留给其他人回答,因为我只有.net方面有Click-Once和Updater Application Block的经验(后者不再继续)。