Pergunta

Tentando atender a uma solicitação de funcionalidade de nossos clientes, gostaria que meu aplicativo, quando a Internet estiver disponível, verificasse em nosso site se uma nova versão está disponível.

O problema é que não tenho ideia do que deve ser feito no lado do servidor.

Posso imaginar que minha aplicação (desenvolvida em C++ usando Qt) tenha que enviar uma solicitação (HTTP?) ao servidor, mas o que vai responder a essa solicitação?Para passar por firewalls, acho que terei que usar a porta 80?Isso está correto?

Ou, para esse recurso, preciso pedir ao administrador da rede para abrir um número de porta específico através do qual irei me comunicar?


@pilif :obrigado pela sua resposta detalhada.Ainda há algo que não está claro para mim:

como

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

Então você pode retornar o que quiser, provavelmente também o URL de download do instalador da nova versão.

Como faço para devolver algo?Será uma página php ou asp (não sei nada de PHP nem ASP, devo confessar)?Como posso decodificar o ?version=1.2.4 parte para retornar algo de acordo?

Foi útil?

Solução

Eu absolutamente recomendo fazer apenas uma solicitação HTTP simples para o seu site.Todo o resto está fadado ao fracasso.

Eu faria uma solicitação HTTP GET para uma determinada página do seu site contendo a versão do aplicativo local.

como

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

Então você pode retornar o que quiser, provavelmente também o URL de download do instalador da nova versão.

Por que não simplesmente colocar um arquivo estático com a versão mais recente no servidor e deixar o cliente decidir?Porque você pode querer (ou precisar) ter controle sobre o processo.Talvez 1.2 não seja compatível com o servidor no futuro, então você deseja que o servidor force a atualização para 1.3, mas a atualização de 1.2.4 para 1.2.6 pode não ser crítica, então você pode querer apresentar ao cliente uma atualização opcional.

Ou você quer fazer um detalhamento da base instalada.

Como queiras.Normalmente, aprendi que é melhor manter o máximo de inteligência no servidor, porque é sobre o servidor que você tem controle total.

Falando aqui com um pouco de experiência na área, aqui está uma pequena prévia do que pode (e irá - confie em mim) dar errado:

  • Seu aplicativo será impedido de fazer solicitações HTTP pelos vários aplicativos de Firewall Pessoal existentes.
  • Uma porcentagem considerável de usuários não terá as permissões necessárias para iniciar o processo de atualização.
  • Mesmo que seus usuários tenham permitido a versão antiga passar por seu firewall pessoal, essa ferramenta reclamará porque o .EXE foi alterado e recomendará ao usuário não permitir a conexão do novo exe (os usuários geralmente atendem aos desejos de sua ferramenta de segurança aqui) .
  • Em ambientes gerenciados, você será baleado e enforcado (não necessariamente nessa ordem) por carregar conteúdo executável da web e depois executá-lo.

Então, para manter o dano o mais baixo possível,

  • falha silenciosamente quando você não consegue se conectar ao servidor de atualização
  • antes de atualizar, certifique-se de ter permissão de gravação no diretório de instalação e avise o usuário se não tiver ou simplesmente não atualizar.
  • Forneça uma maneira para os administradores desativarem a atualização automática.

Não é divertido fazer o que você está prestes a fazer - especialmente quando você lida com usuários sem conhecimento técnico, como fiz inúmeras vezes.

Outras dicas

A resposta do Pilif foi boa e também tenho muita experiência com isso, mas gostaria de acrescentar algo mais:

Lembre-se de que se você iniciar yourapp.exe, o "atualizador" tentará substituir yourapp.exe pela versão mais recente.Dependendo do seu sistema operacional e ambiente de programação (você mencionou C++/QT, não tenho experiência com eles), você não ser capaz de sobrescrever seuapp.exe porque estará em uso.

O que fiz foi criar um lançador.Eu tenho um MyAppLauncher.exe que usa um arquivo de configuração (xml, muito simples) para iniciar o "exe real".Caso exista uma nova versão, o Launcher pode atualizar o "exe real" porque não está em uso e, em seguida, reiniciar a nova versão.

Apenas tenha isso em mente e você estará seguro.

Martinho,

você está absolutamente certo, é claro.Mas eu entregaria o launcher com o instalador.Ou apenas baixe o instalador, inicie-o e saia o mais rápido possível.O motivo são bugs no inicializador.Você nunca, jamais, iria querer depender de um componente que não pode atualizar (ou esquecer de incluir no lançamento inicial).

Portanto, a carga útil que distribuo com o processo de atualização do meu aplicativo é apenas o instalador padrão, mas desprovido de qualquer interface de usuário significativa.Depois que o cliente verificar se o instalador tem chance de ser executado com sucesso e depois de baixar o atualizador, ele o executa e fecha sozinho.

O atualizador é executado, instala sua carga no diretório de instalação original e reinicia o aplicativo (esperançosamente atualizado).

Ainda:O processo é complicado e é melhor você pensar duas vezes antes de implementar uma funcionalidade de atualização automática na plataforma Windows quando seu aplicativo tiver um amplo foco de uso.

em php a coisa é fácil:

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

é claro que você poderia estender isso para que a versão atualmente disponível não seja codificada dentro do script, mas isso é apenas para ilustrar o ponto.

Na sua aplicação você teria este pseudocódigo:

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

Sinta-se à vontade para estender o "protocolo" especificando algo que o script PHP possa retornar para informar ao cliente se é uma atualização importante e obrigatória ou não.

Ou você pode adicionar algum texto para exibir ao usuário - talvez contendo algumas informações sobre o que mudou.

Suas possibilidades são ilimitadas.

Meu aplicativo Qt usa apenas QHttp para ler pequenos arquivos XML do meu site que contém o número da versão mais recente.Se for maior que o número da versão atual, será possível ir para a página de download.Muito simples.Funciona bem.

Eu concordaria com a resposta de @Martin e @Pilif, mas acrescentaria;

Considere permitir que seus usuários finais decidam se desejam realmente instalar a atualização naquele momento ou adiar a instalação da atualização até que terminem de usar o programa.

Não sei a finalidade/função do seu aplicativo, mas muitos aplicativos são iniciados quando o usuário precisa fazer algo específico naquele momento - nada mais irritante do que iniciar um aplicativo e ser informado de que encontrou uma nova versão e você precisa espere o download, desligue o aplicativo e reinicie-o.Se o seu programa possuir outros recursos que possam ser atualizados (arquivos de referência, bancos de dados etc.) o problema piora.

Tínhamos um sistema EPOS rodando em cerca de 400 lojas, e inicialmente pensamos que seria ótimo ter as atualizações do programa e baixá-las (usando um arquivo contendo um número de versão muito semelhante às sugestões acima)...boa ideia.Até que todas as lojas iniciassem seus sistemas mais ou menos ao mesmo tempo (8h45-8h50), e nosso servidor fosse atingido servindo um download de mais de 20 Mb para 400 servidores remotos, o que atualizaria o software local e causaria um reiniciar.Caos - sem ninguém capaz de negociar por cerca de 10 minutos.

Escusado será dizer que isso fez com que desligássemos posteriormente o recurso “verificar atualizações” e o redesenhássemos para permitir que as lojas “adiassem” a atualização até o final do dia.:-)

EDITAR:E se alguém da ADOBE está lendo - pelo amor de Deus, por que o maldito leitor acrobata insiste em tentar baixar atualizações e porcarias quando eu só quero ligá-lo para ler um documento?Não é lento o suficiente no início e inchado o suficiente, sem perder mais 20 a 30 segundos da minha vida procurando atualizações toda vez que quero ler um PDF?
ELES NÃO USAM SEU PRÓPRIO SOFTWARE??!!! :-)

No servidor você pode ter apenas um arquivo simples "latestversion.txt" que contém o número da versão (e talvez o URL de download) da versão mais recente.O cliente então só precisa ler este arquivo usando uma simples solicitação HTTP (sim, para a porta 80) para recuperar http://seu.web.site/latestversion.txt, que você pode analisar para obter o número da versão.Dessa forma, você não precisa de nenhum código de servidor sofisticado – você só precisa adicionar um arquivo simples ao seu site existente.

se você mantiver seus arquivos no diretório de atualização em example.com, este script PHP deverá baixá-los para você, atendendo à solicitação mencionada anteriormente.(sua atualização seria 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");

Isso faz com que seu navegador pense que está baixando um aplicativo.

A maneira mais simples de fazer isso acontecer é disparar uma solicitação HTTP usando uma biblioteca como libcurl e faça o download de um arquivo ini ou xml que contenha a versão online e onde uma nova versão estaria disponível online.

Depois de analisar o arquivo xml, você pode determinar se uma nova versão é necessária e baixar a nova versão com libcurl e instalá-la.

Basta colocar um arquivo (XML) em seu servidor com o número da versão mais recente e uma URL para baixar a nova versão.Seu aplicativo pode então solicitar o arquivo XML, verificar se a versão é diferente da sua e tomar as medidas adequadas.

Acho que um simples arquivo XML no servidor seria suficiente apenas para fins de verificação de versão.

Você precisaria então apenas de uma conta FTP em seu servidor e de um sistema de compilação capaz de enviar um arquivo via FTP após a criação de uma nova versão.Esse sistema de compilação pode até colocar arquivos de instalação/zip diretamente no seu site!

Se você quiser mantê-lo realmente básico, basta fazer upload de um version.txt para um servidor web, que contém um número de versão inteiro.Baixe essa verificação em relação à versão mais recente.txt que você baixou e, em seguida, basta baixar o msi ou pacote de configuração e executá-lo.

Versões mais avançadas seriam usar rss, xml ou similar.Seria melhor usar uma biblioteca de terceiros para analisar o rss e você poderia incluir informações exibidas ao usuário sobre as alterações, se desejar.

Basicamente, você só precisa de uma funcionalidade simples de download.

Ambas as soluções exigirão apenas que você acesse a porta 80 de saída do lado do cliente.Normalmente, isso não deve exigir nenhuma alteração nos firewalls ou na rede (no lado do cliente) e você simplesmente precisa ter um servidor web voltado para a Internet (hospedagem na web, colocation ou seu próprio servidor - tudo funcionaria aqui).

Existem algumas soluções comerciais de atualização automática disponíveis.Deixarei as recomendações para outros respondentes, porque só tenho experiência no lado .net com Click-Once e Updater Application Block (este último não tem mais continuidade).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top