Controllo automatico della disponibilità di una nuova versione della mia applicazione

StackOverflow https://stackoverflow.com/questions/56391

  •  09-06-2019
  •  | 
  •  

Domanda

Cercando di soddisfare una richiesta di funzionalità da parte dei nostri clienti, vorrei che la mia applicazione, quando Internet è disponibile, controlli sul nostro sito web se è disponibile una nuova versione.

Il problema è che non ho idea di cosa debba essere fatto lato server.

Posso immaginare che la mia applicazione (sviluppata in C++ utilizzando Qt) debba inviare una richiesta (HTTP?) al server, ma cosa risponderà a questa richiesta?Per passare attraverso i firewall, immagino che dovrò usare la porta 80?È corretto ?

Oppure, per tale funzionalità, devo chiedere al nostro amministratore di rete di aprire un numero di porta specifico attraverso il quale comunicherò?


@pilif :grazie per la tua risposta dettagliataC'è ancora una cosa che non mi è chiara:

Piace

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

Quindi puoi restituire quello che vuoi, probabilmente anche l'URL di download del programma di installazione della nuova versione.

Come posso restituire qualcosa?Sarà una pagina php o asp (non so nulla di PHP né ASP, devo confessarlo)?Come posso decodificare il file ?version=1.2.4 parte per restituire qualcosa di conseguenza?

È stato utile?

Soluzione

Consiglierei assolutamente di fare semplicemente una semplice richiesta HTTP al tuo sito web.Tutto il resto è destinato a fallire.

Farei una richiesta HTTP GET a una determinata pagina del tuo sito contenente la versione dell'applicazione locale.

Piace

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

Quindi puoi restituire quello che vuoi, probabilmente anche l'URL di download del programma di installazione della nuova versione.

Perché non semplicemente inserire un file statico con la versione più recente sul server e lasciare che sia il client a decidere?Perché potresti voler (o aver bisogno) di avere il controllo sul processo.Forse 1.2 non sarà compatibile con il server in futuro, quindi vuoi che il server forzi l'aggiornamento a 1.3, ma l'aggiornamento da 1.2.4 a 1.2.6 potrebbe non essere critico, quindi potresti voler presentare al client un aggiornamento facoltativo.

Oppure vuoi avere un'analisi della base installata.

O qualunque cosa.Di solito, ho imparato che è meglio mantenere la massima intelligenza sul server, perché il server è ciò su cui hai il controllo finale.

Parlando qui con un po' di esperienza sul campo, ecco una piccola anteprima di ciò che può (e andrà, credetemi) andare storto:

  • Alla tua applicazione verrà impedito di effettuare richieste HTTP dalle varie applicazioni Personal Firewall disponibili.
  • Una percentuale considerevole di utenti non disporrà delle autorizzazioni necessarie per avviare effettivamente il processo di aggiornamento.
  • Anche se i tuoi utenti hanno consentito alla vecchia versione di oltrepassare il proprio firewall personale, detto strumento si lamenterà perché il file .EXE è cambiato e consiglierà all'utente di non consentire la connessione del nuovo exe (gli utenti di solito soddisfano i desideri del loro strumento di sicurezza qui) .
  • Negli ambienti gestiti verrai colpito e impiccato (non necessariamente in quest'ordine) se carichi contenuto eseguibile dal Web e poi lo esegui effettivamente.

Quindi, per mantenere il danno più basso possibile,

  • falliscono silenziosamente quando non è possibile connettersi al server di aggiornamento
  • prima dell'aggiornamento, assicurati di avere i permessi di scrittura sulla directory di installazione e avvisa l'utente se non li hai, o semplicemente non aggiorni affatto.
  • Fornire agli amministratori un modo per disattivare l'aggiornamento automatico.

Non è divertente fare quello che stai per fare, specialmente quando hai a che fare con utenti non tecnicamente inclini come ho dovuto fare numerose volte.

Altri suggerimenti

La risposta di Pilif è stata buona e ho molta esperienza anche in questo senso, ma vorrei aggiungere qualcosa in più:

Ricorda che se avvii yourapp.exe, l '"aggiornamento" proverà a sovrascrivere yourapp.exe con la versione più recente.A seconda del tuo sistema operativo e dell'ambiente di programmazione (hai menzionato C++/QT, non ho esperienza con quelli), lo farai non poter sovrascrivere yourapp.exe perché sarà in uso.

Quello che ho fatto è creare un launcher.Ho un MyAppLauncher.exe che utilizza un file di configurazione (xml, molto semplice) per avviare il "vero exe".Se esiste una nuova versione, il Launcher può aggiornare il "vero exe" perché non è in uso, quindi riavviare la nuova versione.

Tienilo a mente e sarai al sicuro.

Martino,

hai assolutamente ragione ovviamente.Ma consegnerei il launcher con il programma di installazione.Oppure semplicemente scarica il programma di installazione, avvialo e chiudilo il prima possibile.Il motivo sono i bug nel launcher.Non vorrai mai e poi mai dipendere da un componente che non puoi aggiornare (o dimenticare di includere nel rilascio iniziale).

Quindi il payload che distribuisco con il processo di aggiornamento della mia applicazione è solo il programma di installazione standard, ma privo di un'interfaccia utente significativa.Una volta che il client ha verificato che il programma di installazione abbia la possibilità di essere eseguito correttamente e una volta scaricato il programma di aggiornamento, lo esegue e si chiude da solo.

Il programma di aggiornamento viene eseguito, installa il suo payload nella directory di installazione originale e riavvia l'applicazione (si spera aggiornata).

Ancora:Il processo è complicato ed è meglio pensarci due volte prima di implementare una funzionalità di aggiornamento automatico sulla piattaforma Windows quando l'applicazione ha un ampio focus di utilizzo.

in php, la cosa è semplice:

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

se ovviamente potresti estenderlo in modo che la versione attualmente disponibile non sia codificata all'interno dello script, ma questo è solo per illustrare il punto.

Nella tua applicazione avresti questo pseudo codice:

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

Sentiti libero di estendere il "protocollo" specificando qualcosa che lo script PHP potrebbe restituire per dire al client se si tratta di un aggiornamento importante e obbligatorio o meno.

Oppure puoi aggiungere del testo da mostrare all'utente, magari contenente alcune informazioni su cosa è cambiato.

Le tue possibilità sono abbastanza illimitate.

La mia app Qt utilizza semplicemente QHttp per leggere un piccolo file XML dal mio sito Web che contiene il numero di versione più recente.Se questo è maggiore del numero di versione corrente, dà la possibilità di andare alla pagina di download.Molto semplice.Funziona bene.

Sarei d'accordo con la risposta di @Martin e @Pilif, ma aggiungo;

Considera la possibilità di consentire agli utenti finali di decidere se desiderano installare effettivamente l'aggiornamento in quel momento o ritardare l'installazione dell'aggiornamento finché non avranno finito di utilizzare il programma.

Non conosco lo scopo/la funzione della tua app, ma molte applicazioni vengono avviate quando l'utente ha bisogno di fare qualcosa di specifico lì per lì - niente di più fastidioso che avviare un'app e poi sentirsi dire che è stata trovata una nuova versione e tu devi farlo attendere il download, chiudere l'app e riavviarla.Se il tuo programma ha altre risorse che potrebbero essere aggiornate (file di riferimento, database ecc.) il problema peggiora.

Avevamo un sistema EPOS in funzione in circa 400 negozi e inizialmente abbiamo pensato che sarebbe stato fantastico avere il programma in grado di individuare gli aggiornamenti e scaricarli (utilizzando un file contenente un numero di versione molto simile ai suggerimenti che hai sopra)...grande idea.Fino a quando tutti i negozi non hanno avviato i loro sistemi più o meno alla stessa ora (8:45-8:50) e il nostro server è stato colpito fornendo un download di oltre 20 Mb a 400 server remoti, che avrebbe quindi aggiornato il software locale e causato un ricomincia.Caos: nessuno può fare trading per circa 10 minuti.

Inutile dire che questo ci ha portato a disattivare la funzione "verifica aggiornamenti" e a riprogettarla per consentire ai negozi di "ritardare" l'aggiornamento fino a più tardi nel corso della giornata.:-)

MODIFICARE:E se qualcuno di ADOBE sta leggendo, per l'amor di Dio, perché quel maledetto lettore acrobata insiste nel provare a scaricare aggiornamenti e schifezze quando io voglio solo accenderlo per leggere un documento?Non è abbastanza lento all'avvio e abbastanza gonfio così com'è, senza sprecare altri 20-30 secondi della mia vita a cercare aggiornamenti ogni volta che voglio leggere un PDF?
NON UTILIZZANO IL PROPRIO SOFTWARE??!!! :-)

Sul server potresti avere semplicemente un semplice file "latestversion.txt" che contiene il numero di versione (e forse l'URL di download) dell'ultima versione.Il client deve quindi solo leggere questo file utilizzando una semplice richiesta HTTP (sì, alla porta 80) per recuperarlo http://tuo.sito.web/ultimaversione.txt, che puoi quindi analizzare per ottenere il numero di versione.In questo modo non hai bisogno di alcun codice server elaborato: devi solo aggiungere un semplice file al tuo sito web esistente.

se conservi i tuoi file nella directory di aggiornamento su example.com, questo script PHP dovrebbe scaricarli per te data la richiesta menzionata in precedenza.(il tuo aggiornamento sarebbe 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");

Questo fa sì che il tuo browser web pensi che stia scaricando un'applicazione.

Il modo più semplice per far sì che ciò accada è avviare una richiesta HTTP utilizzando una libreria simile libcurl e fargli scaricare un file ini o xml che contenga la versione online e dove una nuova versione sarà disponibile online.

Dopo aver analizzato il file xml puoi determinare se è necessaria una nuova versione, scaricare la nuova versione con libcurl e installarla.

Basta inserire un file (XML) sul tuo server con il numero di versione dell'ultima versione e un URL da cui scaricare la nuova versione.La tua applicazione può quindi richiedere il file XML, verificare se la versione è diversa dalla propria e agire di conseguenza.

Penso che un semplice file XML sul server sarebbe sufficiente solo per scopi di controllo della versione.

Avresti quindi bisogno solo di un account ftp sul tuo server e di creare un sistema in grado di inviare un file tramite ftp dopo aver creato una nuova versione.Quel sistema di build potrebbe persino inserire file di installazione/zip direttamente sul tuo sito web!

Se vuoi mantenerlo davvero semplice, carica semplicemente un file version.txt su un server web, che contiene un numero di versione intero.Scarica il controllo confrontandolo con l'ultima versione.txt scaricata, quindi scarica semplicemente il pacchetto MSI o di installazione ed eseguilo.

Versioni più avanzate potrebbero utilizzare RSS, XML o simili.Sarebbe meglio utilizzare una libreria di terze parti per analizzare l'RSS e potresti includere le informazioni visualizzate all'utente sulle modifiche, se lo desideri.

Fondamentalmente hai solo bisogno di una semplice funzionalità di download.

Entrambe queste soluzioni richiederanno solo l'accesso alla porta 80 in uscita dal lato client.Questo normalmente non dovrebbe richiedere alcuna modifica ai firewall o alla rete (sul lato client) e devi semplicemente avere un server web con connessione Internet (hosting web, colocation o il tuo server: tutto funzionerebbe qui).

Sono disponibili un paio di soluzioni commerciali di aggiornamento automatico.Lascerò i consigli per quelli ad altri risponditori, perché ho esperienza solo sul lato .net con Click-Once e Updater Application Block (quest'ultimo non viene più continuato).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top