Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

WD14 - Mise à jour automatique d'une application

28 réponses
Avatar
Michel
Bonjour,

J'ai plac=E9 une application sur un serveur web pour permettre aux
utilisateurs de la t=E9l=E9charger puis de l'installer chez eux. D=E8s
qu'ils lancent leur application et qu'une mise =E0 jour est disponible
sur le serveur, les utilisateurs ont la possibilit=E9 d'en b=E9n=E9ficier.
Aujourd'hui, je souhaite changer le serveur qui sert au
t=E9l=E9chargement.
Comment faut-il proc=E9der pour que cela soit transparent pour les
utilisateurs ?
Est-ce qu'il est possible de pr=E9ciser dans l'exe de la derni=E8re
version disponible sur le serveur A que dor=E9navant les mises =E0 jour
seront sur le serveur B ?
Merci d'avance

10 réponses

1 2 3
Avatar
Alex
Sur un projet perso, je me suis fait un auto-update maison :
-check d'un fichier INI par http toutes les minutes
-si la version a changé lecture des URL de téléchargement dans le m ême
fichier
-permet de changer facilement de serveur et mettant simplement à jour
mon fichier INI
-en plus les aides sont sur le site web, et les URL sont dans le
fichier INI
-donc je peux changer les URL des aides à tout moment
-affichage d'un bouton mise à jour
-clic utilisateur
-simple lancement de téléchargement (toujours HTTP avec
lanceappliassociée)

Actuellement 3.000.000 de requêtes sur ce fichier.
Ça me me permet d'avoir une stat sur l'utilisation du logiciel au
passage.

Cordialement.
Avatar
Gilles
Dans son message précédent, Alex a écrit :
Sur un projet perso, je me suis fait un auto-update maison :
-check d'un fichier INI par http toutes les minutes



Dans un thread séparé?
Avatar
Alex
Non dans un timer lancé par une classe au démarrage du projet :

cApplication::gbTimerPrincipal()

Et dedans tu mets les trucs à faire :
-toutes les minutes
-toutes les heures, etc...

Sinon tu lances un timer dans la fenêtre principale.

Ça devrait aussi marcher avec un thread.
Mais j'ai pas voulu me compliquer la vie.
Avatar
Alex
PROCEDURE PRIVÉE GLOBALE gbTimer()

::ghHeure = HeureSys()

nSec est un entier
sOk est une chaîne
sTrace est une chaîne

nSec = 60
sOk = PartieDécimale(::ghHeure..Seconde/nSec)

// Update toutes les 60 secondes
SI sOk="0" ...
ET (FenEtat(cApp::gsFenPrinc)<>Inexistant) ALORS // Fenêtre existe
SI cApp::gsFenPrincþnEnCours() ALORS // Fenêtre active
::gbUpdateDetecteHttp()
FIN
FIN
Avatar
Alex
PROCEDURE GLOBALE gbUpdateDetecteHttp(LOCAL bForce est un
booléenúux)

oHt est un cHttp

SI ::gbUpdateAfficher OU bForce ALORS
SI oHt:mbRequete(::gsVarUpdateIni, ::gsVarUpdateIniLocal) ALORS //
Requete HTTP

// Variables site
::gbInitialiseIni(Vrai) // UPDATE.INI

FIN
FIN
Avatar
Alex
PROCEDURE GLOBALE gbInitialiseIni(LOCAL bAfficheMisesAJour est un
booléenúux)

oIni est un cIni
oIni:mbIniInitialise(::gsVarUpdateIniLocal)

// URL Fichier de MAJ
::gsVarUpdateIni = oIni:msIniLit("INI", "URL")

// Version officielle
::gsVarOffVersion = oIni:msIniLit( "UPDATE", "VERS")
::gsVarOffInfo = oIni:msIniLit( "UPDATE", "INFO")
::gsVarOffInstall = oIni:msIniLit( "UPDATE", "CLAS")
::gsVarOffUsbZip = oIni:msIniLit( "UPDATE", "USBZ")
::gsVarOffUsbZipAuto = oIni:msIniLit( "UPDATE", "USBA")
::gsVarOffFrameWork = oIni:msIniLit( "UPDATE", "FRAM")

// Version Beta
::gsVarBetaVersion = oIni:msIniLit( "BETA", "VERS")
::gsVarBetaInfo = oIni:msIniLit( "BETA", "INFO")
::gsVarBetaInstall = oIni:msIniLit( "BETA", "CLAS")
::gsVarBetaUsbZip = oIni:msIniLit( "BETA", "USBZ")
::gsVarBetaUsbZipAuto = oIni:msIniLit( "BETA", "USBA")
::gsVarBetaFrameWork = oIni:msIniLit( "BETA", "FRAM")


SI bAfficheMisesAJour ALORS
::gbUpdateTrouveeOff = (cApp::gsVarOffVersion>cApp::gsExeVersion)
::gbUpdateTrouveeBeta = (cApp::gsVarBetaVersion>cApp::gsExeVersion)
FIN

RENVOYER Vrai
Avatar
Alex
Je ne me suis pas pris la tete :
-requete HTTP
-écriture du résultat dans un ini local
-lecture des variables avec inilit
-actions en fonction des variables trouvées

:)
Avatar
Alex
gbTimer utilise un timer automatique de WD
Avatar
Alex
Je check les mises à jour uniquement
si l'utilisateur est sur la fenêtre principale.

Pas besoin de plus dans mon cas.
Avatar
Alex
Toutes les fonctions W-Langage sont encapsulées dans des classes.
Ça fait un code plus court et un tuning global au niveau de l'appli.

Exemple :

Dans toutes les classes j'utilise des affichages Jauge
dans la barre de titre de l'appli.

Chaque classe affiche des messages :
progression, ok ou echec, erreur, téléchargement, lit, écrit, etc...

Chaque classe gère les erreurs, ex. :
-tu retires la clé USB
-l'appli n'a plus accès aux fichiers
-au lieu de planter elle va te dire de remettre la clé USB
-et continuer à fonctionner en mode déconnecté
-etc...

Voila :)
1 2 3