Question

Essayant d'honorer une demande de fonctionnalité de nos clients, j'aimerais que mon application, lorsqu'Internet est disponible, vérifie sur notre site si une nouvelle version est disponible.

Le problème est que je n'ai aucune idée de ce qu'il faut faire côté serveur.

J'imagine bien que mon application (développée en C++ sous Qt) doive envoyer une requête (HTTP ?) au serveur, mais qu'est-ce qui va répondre à cette requête ?Pour passer les pare-feu, je suppose que je devrai utiliser le port 80 ?Est-ce correct ?

Ou, pour une telle fonctionnalité, dois-je demander à notre administrateur réseau d'ouvrir un numéro de port spécifique par lequel je communiquerai ?


@pilif :merci pour votre réponse détaillée.Il y a encore quelque chose qui n'est pas clair pour moi :

comme

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

Ensuite, vous pouvez renvoyer ce que vous voulez, probablement aussi l'URL de téléchargement du programme d'installation de la nouvelle version.

Comment retourner quelque chose ?S'agira-t-il d'une page php ou asp (je ne connais rien à PHP ni à ASP, je dois l'avouer) ?Comment puis-je décoder le ?version=1.2.4 partie afin de retourner quelque chose en conséquence ?

Était-ce utile?

La solution

Je recommanderais absolument de simplement faire une simple requête HTTP sur votre site Web.Tout le reste est voué à l’échec.

Je ferais une requête HTTP GET sur une certaine page de votre site contenant la version de l'application locale.

comme

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

Ensuite, vous pouvez renvoyer ce que vous voulez, probablement aussi l'URL de téléchargement du programme d'installation de la nouvelle version.

Pourquoi ne pas simplement placer un fichier statique avec la dernière version sur le serveur et laisser le client décider ?Parce que vous voudrez peut-être (ou aurez besoin) de contrôler le processus.Peut-être que la version 1.2 ne sera pas compatible avec le serveur à l'avenir, vous souhaitez donc que le serveur force la mise à jour vers la version 1.3, mais la mise à jour de la version 1.2.4 vers la version 1.2.6 pourrait ne pas être critique, vous souhaiterez donc peut-être présenter au client une mise à jour facultative.

Ou bien vous souhaitez avoir une répartition sur la base installée.

Ou peu importe.Habituellement, j'ai appris qu'il est préférable de conserver autant d'informations sur le serveur, car c'est sur le serveur que vous avez le contrôle ultime.

Parlant ici avec un peu d'expérience dans le domaine, voici un petit aperçu de ce qui peut (et va - croyez-moi) mal se passer :

  • Votre application ne pourra pas effectuer de requêtes HTTP par les différentes applications de pare-feu personnel.
  • Un pourcentage considérable d’utilisateurs ne disposeront pas des autorisations nécessaires pour lancer le processus de mise à jour.
  • Même si vos utilisateurs ont autorisé l'ancienne version à passer leur pare-feu personnel, ledit outil se plaindra car le .EXE a changé et recommandera à l'utilisateur de ne pas autoriser le nouvel exe à se connecter (les utilisateurs se conforment généralement aux souhaits de leur outil de sécurité ici). .
  • Dans les environnements gérés, vous serez abattu et pendu (pas nécessairement dans cet ordre) pour avoir chargé du contenu exécutable à partir du Web, puis l'avoir exécuté.

Donc, pour limiter les dégâts au maximum,

  • échouer silencieusement lorsque vous ne pouvez pas vous connecter au serveur de mise à jour
  • avant la mise à jour, assurez-vous que vous disposez des autorisations d'écriture sur le répertoire d'installation et avertissez l'utilisateur si vous ne le faites pas, ou si vous ne mettez tout simplement pas à jour du tout.
  • Offrez aux administrateurs un moyen de désactiver la mise à jour automatique.

Ce n'est pas amusant de faire ce que vous vous apprêtez à faire - surtout lorsque vous avez affaire à des utilisateurs qui ne sont pas techniquement enclins, comme j'ai dû le faire à plusieurs reprises.

Autres conseils

La réponse de Pilif était bonne, et j'ai aussi beaucoup d'expérience dans ce domaine, mais j'aimerais ajouter quelque chose de plus :

N'oubliez pas que si vous démarrez yourapp.exe, le « programme de mise à jour » tentera d'écraser yourapp.exe par la version la plus récente.En fonction de votre système d'exploitation et de votre environnement de programmation (vous avez mentionné C++/QT, je n'en ai aucune expérience), vous pas pouvoir écraser votreapp.exe car il sera utilisé.

Ce que j'ai fait, c'est créer un lanceur.J'ai un MyAppLauncher.exe qui utilise un fichier de configuration (xml, très simple) pour lancer le "vrai exe".Si une nouvelle version existe, le Launcher peut mettre à jour le "vrai exe" car il n'est pas utilisé, puis relancer la nouvelle version.

Gardez cela à l’esprit et vous serez en sécurité.

Martin,

vous avez tout à fait raison bien sûr.Mais je livrerais le lanceur avec l'installateur.Ou téléchargez simplement le programme d'installation, lancez-le et quittez-moi dès que possible.La raison est un bug dans le lanceur.Vous ne voudriez jamais, au grand jamais, dépendre d'un composant que vous ne pouvez pas mettre à jour (ou oublier d'inclure dans la livraison initiale).

Ainsi, la charge utile que je distribue avec le processus de mise à jour de mon application n'est que le programme d'installation standard, mais dépourvu de toute interface utilisateur significative.Une fois que le client a vérifié que le programme d'installation a une chance de s'exécuter correctement et qu'il a téléchargé le programme de mise à jour, il l'exécute et se quitte.

Le programme de mise à jour s'exécute ensuite, installe sa charge utile dans le répertoire d'installation d'origine et redémarre l'application (espérons-le mise à jour).

Toujours:Le processus est délicat et il vaut mieux y réfléchir à deux fois avant d'implémenter une fonctionnalité de mise à jour automatique sur la plate-forme Windows lorsque votre application a un large champ d'utilisation.

en php, c'est simple :

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

bien sûr, vous pouvez étendre cela afin que la version actuellement disponible ne soit pas codée en dur dans le script, mais il s'agit simplement d'illustrer ce point.

Dans votre application vous auriez ce pseudo code :

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

N'hésitez pas à étendre le "protocole" en spécifiant quelque chose que le script PHP pourrait renvoyer pour indiquer au client s'il s'agit d'une mise à jour importante et obligatoire ou non.

Ou vous pouvez ajouter du texte à afficher à l'utilisateur - contenant peut-être des informations sur ce qui a changé.

Vos possibilités sont tout à fait illimitées.

Mon application Qt utilise simplement QHttp pour lire un petit fichier XML sur mon site Web contenant le dernier numéro de version.Si celui-ci est supérieur au numéro de version actuel, cela donne la possibilité d'accéder à la page de téléchargement.Très simple.Fonctionne bien.

Je serais d'accord avec la réponse de @Martin et @Pilif, mais j'ajouterais ;

Pensez à permettre à vos utilisateurs finaux de décider s'ils souhaitent réellement installer la mise à jour sur-le-champ, ou retarder l'installation de la mise à jour jusqu'à ce qu'ils aient fini d'utiliser le programme.

Je ne connais pas le but/la fonction de votre application, mais de nombreuses applications sont lancées lorsque l'utilisateur doit faire quelque chose de spécifique sur-le-champ - rien de plus ennuyeux que de lancer une application et de se faire dire ensuite qu'elle a trouvé une nouvelle version, et que vous deviez le faire. attendez qu'il se télécharge, fermez l'application et relancez-la.Si votre programme dispose d'autres ressources susceptibles d'être mises à jour (fichiers de référence, bases de données, etc.), le problème s'aggrave.

Nous avions un système EPOS fonctionnant dans environ 400 magasins, et au départ, nous avons pensé que ce serait formidable que le programme détecte les mises à jour et les télécharge (en utilisant un fichier contenant un numéro de version très similaire aux suggestions que vous avez ci-dessus)...bonne idée.Jusqu'à ce que tous les magasins démarrent leurs systèmes à peu près en même temps (8h45-8h50) et que notre serveur soit touché et qu'il servait un téléchargement de plus de 20 Mo vers 400 serveurs distants, ce qui mettait alors à jour le logiciel local et provoquait un problème. redémarrage.Chaos – personne ne pouvant échanger pendant environ 10 minutes.

Inutile de dire que cela nous a amenés à désactiver la fonction « vérifier les mises à jour » et à la repenser pour permettre aux magasins de « retarder » la mise à jour jusqu'à plus tard dans la journée.:-)

MODIFIER:Et si quelqu'un d'ADOBE lit - pour l'amour de Dieu, pourquoi ce foutu lecteur acrobate insiste-t-il pour essayer de télécharger des mises à jour et des conneries alors que je veux juste le lancer pour lire un document ?N'est-il pas assez lent au démarrage et suffisamment volumineux pour ne pas perdre 20 à 30 secondes supplémentaires de ma vie à chercher des mises à jour à chaque fois que je veux lire un PDF ?
N'UTILISENT-ILS PAS LEUR PROPRE LOGICIEL ??!!! :-)

Sur le serveur, vous pouvez simplement avoir un simple fichier "latestversion.txt" qui contient le numéro de version (et peut-être l'URL de téléchargement) de la dernière version.Il suffit alors au client de lire ce fichier à l'aide d'une simple requête HTTP (oui, vers le port 80) pour récupérer http://votre.web.site/latestversion.txt, que vous pouvez ensuite analyser pour obtenir le numéro de version.De cette façon, vous n'avez pas besoin d'un code serveur sophistiqué : il vous suffit d'ajouter un simple fichier à votre site Web existant.

si vous conservez vos fichiers dans le répertoire de mise à jour sur example.com, ce script PHP devrait les télécharger pour vous compte tenu de la demande mentionnée précédemment.(votre mise à jour serait 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");

Cela fait croire à votre navigateur Web qu’il télécharge une application.

Le moyen le plus simple d'y parvenir est de lancer une requête HTTP à l'aide d'une bibliothèque telle que libcurl et faites-lui télécharger un fichier ini ou xml qui contient la version en ligne et où une nouvelle version serait disponible en ligne.

Après avoir analysé le fichier XML, vous pouvez déterminer si une nouvelle version est nécessaire, télécharger la nouvelle version avec libcurl et l'installer.

Placez simplement un fichier (XML) sur votre serveur avec le numéro de version de la dernière version et une URL à partir de laquelle télécharger la nouvelle version.Votre application peut alors demander le fichier XML, vérifier si la version diffère de la sienne et prendre les mesures en conséquence.

Je pense qu'un simple fichier XML sur le serveur serait suffisant uniquement à des fins de vérification de version.

Vous n'aurez alors besoin que d'un compte FTP sur votre serveur et d'un système de build capable d'envoyer un fichier via FTP après avoir construit une nouvelle version.Ce système de construction pourrait même placer les fichiers d'installation/zip directement sur votre site Web !

Si vous souhaitez rester vraiment basique, téléchargez simplement un fichier version.txt sur un serveur Web, qui contient un numéro de version entier.Téléchargez cette vérification par rapport à la dernière version.txt que vous avez téléchargée, puis téléchargez simplement le package msi ou d'installation et exécutez-le.

Des versions plus avancées consisteraient à utiliser rss, xml ou similaire.Il serait préférable d'utiliser une bibliothèque tierce pour analyser le RSS et vous pourriez inclure des informations affichées à votre utilisateur sur les modifications si vous le souhaitez.

Fondamentalement, vous avez juste besoin d’une simple fonctionnalité de téléchargement.

Ces deux solutions vous demanderont uniquement d'accéder au port 80 sortant du côté client.Cela ne devrait normalement nécessiter aucune modification des pare-feu ou du réseau (côté client) et vous devez simplement disposer d'un serveur Web connecté à Internet (hébergement Web, colocation ou votre propre serveur - tout fonctionnerait ici).

Il existe quelques solutions commerciales de mise à jour automatique disponibles.Je laisserai les recommandations pour celles-ci aux autres répondeurs, car je n'ai d'expérience que du côté .net avec Click-Once et Updater Application Block (ce dernier n'est plus continué).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top