为了满足客户的功能要求,我希望我的应用程序在互联网可用时,如果有新版本,请查看我们的网站.
问题是我不知道在服务器端需要做什么.
我可以想象我的应用程序(使用Qt在C++中开发)必须向服务器发送请求(HTTP?),但是这个请求会响应什么?为了通过防火墙,我想我将不得不使用端口80?它是否正确 ?
或者,对于这样的功能,我是否必须要求我们的网络管理员打开我将通信的特定端口号?
@ pilif:谢谢你的详细解答.还有一些我不清楚的事情:
喜欢
http://www.example.com/update?version=1.2.4
然后你可以返回你想要的东西,也可能是新版本安装程序的下载URL.
我该如何退货?它会是一个php或asp页面(我对PHP和ASP一无所知,我不得不承认)?如何解码?version=1.2.4
零件以便相应地返回内容?
我绝对建议你只是向你的网站做一个普通的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加载可执行内容然后实际执行它.
所以要尽可能降低伤害,
无法连接到更新服务器时无提示失败
在更新之前,请确保您对安装目录具有写入权限,如果不这样做则警告用户,或者根本不更新.
为管理员提供关闭自动更新的方法.
做你将要做的事情并不好玩 - 特别是当你与非技术倾向的用户打交道时,我已经无数次了.
Pilif答案很好,我也有很多经验,但我想补充一点:
请记住,如果启动yourapp.exe,则"更新程序"将尝试使用最新版本覆盖yourapp.exe.根据您的操作系统和编程环境(您已经提到C++/QT,我没有经验),您将无法覆盖yourapp.exe,因为它将被使用.
我所做的是创建一个发射器.我有一个MyAppLauncher.exe使用配置文件(xml,非常简单)来启动"真正的exe".如果存在新版本,Launcher可以更新"真正的exe",因为它没有被使用,然后重新启动新版本.
记住这一点,你就会安全.
马丁,
你当然是对的.但我会用安装程序交付启动器.或者只需下载安装程序,启动它并尽快退出.原因是发射器中的错误.您永远不会想要依赖于您无法更新的组件(或者忘记包含在初始删除中).
因此,我随应用程序的更新过程分发的有效负载只是标准安装程序,但没有任何重要的UI.一旦客户端检查到安装程序有成功运行的机会,并且一旦下载了更新程序,它就会运行并退出.
updater比运行更新,将其有效负载安装到原始安装目录中并重新启动(希望更新的)应用程序.
仍然:这个过程很繁琐,当您的应用程序广泛使用时,您最好在Windows平台上实现自动更新功能之前三思而后行.
在PHP中,事情很简单:
如果你当然可以扩展它,那么当前可用的版本在脚本中不是硬编码的,但这只是说明要点.
在您的应用程序中,您将拥有此伪代码:
result = makeHTTPRequest("http://www.example.com/update?version=" + getExeVersion()); if result != "no update" then updater = downloadUpdater(result); ShellExecute(updater); ExitApplication; end;
可以通过指定PHP脚本可以返回的内容来扩展"协议",以告诉客户端它是否是一个重要的强制更新.
或者您可以添加一些文本以显示给用户 - 可能包含有关更改内容的一些信息.
你的可能性是无限的.