一、自动更新程序流程
加载本地配置文件获取获取保存的版本号
每次启动程序,首先从服务器请求最新的版本信息文件(包括版本号,压缩包下载地址,更新时间,更新说明)
解压下载的文件获取服务器版本号,与本地版本号进行比较,如果高于本地,就下载压缩文件
解压缩程序压缩包
更新本地版本号,启动压缩包程序,退出当前自动更新程序
二、程序方案
首先在主程序中对接服务器中的升级程序接口,判断服务器上的升级文件版本和本地的版本是否对等,不一致的话,就执行升级文件下载任务,当下载任务完成后还需要根据接口获取到的升级程序信息,做md5校验,避免升级后程序无法启动,造成还需要去现场对程序升级的工作。
当这些都无误之后,调用升级程序,退出主程序,但是这里没办法退出主程序后还保持升级程序的独立运行。所以采用的方案重启程序后打开升级程序进行升级工作。
这里还有一个就是程序的一键部署功能,为了多台设备上能够快速的安装部署程序开发部署程序来对软件所需要的参数,配置进行一键设置。
二、代码实现
赋予权限:
if(timenum == 1){//文件夹权限
ui->progressBar->setValue(5);
QString cmd = QString("sudo chmod -R 777 %1").arg(exepath);
std::string str = cmd.toStdString();
const char *cmd_cs= str.c_str();
qDebug()<<"cmd===="<<cmd;
system(cmd_cs);
ui->textEdit->append("对bin64文件夹赋予执行权限");
}
else if(timenum == 2){//部署不需要复制
ui->progressBar->setValue(10);
ui->textEdit->append("...");
}
if(timenum == 3){//QVendingMachine文件权限
ui->progressBar->setValue(15);
QString desktop_dir = exepath +"/" + "QVendingMachine";
QString cmd = QString("sudo chmod -R 777 %1").arg(exepath).arg(desktop_dir);
std::string str = cmd.toStdString();
const char *cmd_cs= str.c_str();
system(cmd_cs);
qDebug()<<"cmd===="<<cmd;
ui->textEdit->append("对bin64下的QVendingMachine赋予执行权限");
}
升级必要的就是文件下载:
//下载文件对象
class QDownFileObject : public QObject
{
Q_OBJECT
public:
explicit QDownFileObject(QObject *parent = nullptr);
~QDownFileObject();
public slots:
bool useCustomInstallProcedures() const;
QString downloadDir() const;
void setDownloadDir(const QString& downloadDir);
signals:
void downloadFinished (const QString& url, const QString& filepath);
public slots:
void setDownInfo(QString path,QString url);//需要下载的信息
void setUrlId (const QString& url);
void startDownload (const QUrl& url);
void setFileName (const QString& file);
void setUserAgentString (const QString& agent);
void setUseCustomInstallProcedures (const bool custom);
private slots:
void finished();
void openDownload();
void installUpdate();
void cancelDownload();
void saveFile (qint64 received, qint64 total);
void calculateSizes (qint64 received, qint64 total);
void updateProgress (qint64 received, qint64 total);
void calculateTimeRemaining (qint64 received, qint64 total);
升级完成后,重启程序,或者,重启系统即可。