[Delphi] Funcionalidade de Atualização Automática – Parte 1

[Delphi] Funcionalidade de Atualização Automática - Parte 1Olá, pessoal, estou de volta com mais um artigo técnico!
Hoje em dia é comum encontrar aplicativos que são atualizados automaticamente pela internet sem a intervenção do usuário. Na verdade, estes aplicativos possuem rotinas específicas que os permitem ser capazes de gerenciar suas próprias atualizações.
Já pensou em implementar essa funcionalidade no seu projeto?
Essa série de artigos, divididas em 3 partes, apresenta um passo-a-passo para codificar uma atualização automática simples, porém, funcional, em Delphi!

 

Se você utiliza o CCleaner, TeamViewer, Notepad++, Picasa, Skype, entre outros, já deve ter recebido uma notificação de que uma nova versão estava disponível, não é? Enquanto alguns destes aplicativos disponibilizam um botão para acessar o link direto para download da nova versão, outros são capazes de baixar a atualização e instalá-la automaticamente no computador. Estes últimos sempre me chamaram a atenção. Refleti sobre como seria possível implementar essa funcionalidade com Delphi sem muita complexidade. Uma das formas mais simples que idealizei, na qual apresentarei nessa série de artigos, é através de arquivos INI e uma conexão FTP.

Ao meu ver, uma das maiores vantagens da atualização automática é dispensar a morosidade do trabalho de atualizar o software em cada cliente, um por um. Antes de implementar essa funcionalidade em um dos meus projetos, era necessário acessar o computador do cliente via TeamViewer e transferir o novo executável de cada versão liberada. Em algumas vezes, eu demorava aproximadamente meio período para concluir a atualização em todos os usuários. Agora, apenas faço o upload da versão para uma área FTP e vou descansar. 🙂

 

Pois bem, pessoal, vamos ao trabalho!
O primeiro passo é adquirir um acesso FTP em algum serviço de hospedagem. Mas, atenção: nem todas hospedagens fornecem conexões FTP e, aquelas que fornecem, geralmente não aceitam uploads de executáveis (.exe) por questões de segurança. Esse foi um dos problemas que lidei ao prosseguir com essa implementação, mas falaremos disso mais tarde.
Após algumas pesquisas, encontrei o Free Web Hosting Area (FreeWHA) que, como o próprio nome induz, é grátis! Basta fazer um cadastro receber as configurações de acesso ao FTP. Clique neste link, digite o nome desejado para o endereço no campo “Free subdomain hosting” (para verificar a disponibilidade) , selecione “orgfree.com” na caixa ao lado e clique em “Proceed”. Para acompanhá-los no artigo e simplificar o tutorial, fiz um cadastro fictício nessa hospedagem:

Vefificação de endereço disponível no FreeWHA

Na próxima janela, preencha o e-mail e uma senha de acesso:

Informações para cadastro no FreeWHA

Pronto! Ao avançar, as informações do endereço FTP já estarão disponíveis!

Informações da conta de FTP no FreeWHA

Futuramente, caso seja necessário entrar no painel de controle da conta para alterar os dados ou consultar os endereços dos servidores, acesse este link.

 

Antes de avançar apara os próximos passos, recomendo fortemente a utilização de um cliente FTP para facilitar a transferência de arquivos. Embora essa operação possa ser feita pelo Windows Explorer (ou Explorador de Arquivos, no Windows 10), um cliente FTP possui vários recursos exclusivos para trabalhar com esse tipo de conexão, como painéis de arquivos, limite de uploads/downloads, resumo de transferências, marcadores e log de mensagens.
Neste artigo, utilizarei o FileZilla. É grátis, leve e fácil de usar. Para baixá-lo, clique aqui.
Após instalá-lo, acesse o menu Arquivo > Gerenciador de Sites. Na janela exibida, clique em “Novo Site” e preencha os campos com os dados do servidor FTP, conforme ilustrado abaixo:

Configuração de FTP no FileZilla

Para fazer um teste, clique em “Conectar”. Se tudo ocorrer como esperado, estes serão os arquivos padrão exibidos no FTP:

Arquivos do FTP exibidos no FileZilla

Criaremos, então, um novo diretório que armazenará o pacote de atualização e o arquivo INI contendo as informações da nova versão. Clique com o botão direito na lista de arquivos do diretório FTP e selecione “Criar Pasta”, nomeando-a como “atualizacao”.

Criação da pasta de atualização no FTP

 

Agora, criaremos dois arquivos INI no disco local, responsáveis por comparar as versões e identificar se há a necessidade de atualização:

  • VersaoLocal.ini: ficará gravado no mesmo diretório do programa e armazenará o número da versão que está atualmente instalada no cliente;
  • VersaoFTP.ini: ficará disponível no diretório FTP e armazenará o número da versão mais recente do programa.

O conteúdo do arquivo “VersaoLocal.ini” será este:

[VersaoLocal]
Numero=1.0.0

Salve-o no mesmo diretório em que se encontra o programa.

Por sua vez, o arquivo “VersaoFTP.ini” terá a mesma estrutura, diferindo apenas no nome da seção:

[VersaoFTP]
Numero=1.0.0

Salve-o em uma pasta temporária e depois transfira-o para a pasta “atualizacao” no diretório FTP. Para isso, no FileZilla, basta arrastar o arquivo para dentro dela:

Upload do arquivo de versão para o FTP

 

Perfeito!
Acompanhe a lógica: na tela de atualização do programa, acessaremos o diretório FTP para baixar o arquivo “VersaoFTP.ini”. Em seguida, faremos a leitura do conteúdo dos dois arquivos INI para comparar os números das versões. Se o número da versão local (por exemplo, “1.0.0”) for diferente (menor) do que o número da versão que está no FTP (por exemplo, “1.0.1”), então assumimos que há uma nova versão disponível. Legal, hein?

Porém, lembre-se que no início do artigo mencionei que servidores FTP normalmente não aceitam uploads de executáveis. Por isso, teremos que compactar o nosso executável antes de transferi-lo para o FTP. Nesse tutorial, o arquivo compactado deverá sempre se chamar “Atualizacao.rar” para que a aplicação o encontre para baixá-lo.
Mesmo assim, encontramos mais um impasse. O Delphi não possui uma função nativa para descompactação de arquivos com extensão RAR. É necessário a utilização de aplicativos externos ou a instalação de componentes de terceiros. Para não gerar complexidade, optei pela primeira opção. Usaremos o 7-Zip! Apenas dois arquivos desse aplicativo são suficientes: o executável e uma DLL. Baixe-os aqui e, em seguida, coloque-os na mesma pasta em que está a aplicação.

Pessoal, só para confirmação, estes são os arquivos que deverão estar em uma mesma pasta:
– Executável
– VersaoLocal.ini
– 7z.exe
– 7z.dll

O outro arquivo INI (VersaoFTP.ini) será baixado para essa pasta em tempo de execução.
Bom, o próximo passo é codificar uma rotina para baixar a atualização, descompactá-la, substituir o executável existente e atualizar o número da versão para que os dois arquivos INI fiquem iguais. Nossa, como faremos tudo isso?

Bom, aguardem a segunda parte dessa série de artigos!

 

Abraço e até a próxima semana!


Confira as outras partes desse artigo:

[Delphi] Funcionalidade de Atualização Automática – Parte 1
[Delphi] Funcionalidade de Atualização Automática – Parte 2
[Delphi] Funcionalidade de Atualização Automática – Parte 3


 

Compartilhe!
Share on FacebookTweet about this on TwitterShare on LinkedInShare on Google+Pin on PinterestEmail this to someone

18 comentários

  1. Muito boa a matéria, estou aguardando a continuação , e mais uma vez obrigado por esta sempre postando conteúdo novo e atualizado . ( Obs : eu tava escrevendo e fiz só o inicio da palavra e apertei Ctrl+Espaço kkkkkkk esperando que se completasse kkkkkkkkk esqueci que nao to no Delphi.)

    1. Boa noite, André!
      A continuação foi publicada hoje. Espero que continue curtindo essa série de artigos!
      Grande abraço! (Obs: também já pressionei Ctrl + Espaço enquanto digitava um texto, haha)

  2. Parabéns André!
    Ótimo artigo, muito bem explicado e ilustrado, também estou no aguardo pela continuação, este assunto é muito interessante. Boa sorte.

  3. Boa noite André.
    Eu aqui de novo.
    Vou acompanhar os artigos, sempre quis fazer assim, incluindo os detalhes de segurança.
    Mas, para mim tem um obstáculo, até mesmo pro suporte remoto: nem todos os meus clientes tem internet.
    Apesar de não ser bom deixar de atender alguns clientes, no futuro próximo, quem não tiver internet, vou cancelar o contrato de suporte (não sei exatamente como proceder), ou eles instalam internet. O custo do atendimento in loco é caro ou pro Desenvolvedor ou pro Cliente.
    A sua proposta de atualização automática, sem dúvida, é a melhor opção.
    Sei de antemão que os artigos serão proveitosos.
    Obrigado.

    1. Olá, Gerson!
      Obrigado pelo feedback!
      A ideia da funcionalidade automática surgiu da dificuldade que eu me deparava ao atualizar o software em vários clientes. Vários fatores complicavam essa atividade: conexão instável com a Internet, cliente indisponível na data da atualização, necessidade de notificar os clientes de novas versões, além, claro, do tempo despendido para concluir todas as atualizações.
      Com o recurso de atualização automática, uma boa conexão com a Internet torna-se indispensável, assim como você mencionou.

      Abraço!

  4. Olá André L. Celestino, como vai?
    Bom, encontrei seu site em busca de uma solução para meu probleminha com Socket no Delphi XE2.
    Meu projeto contém uma aplicação do tipo Chat com criptografia, tudo está funcionando perfeitamente menos a parte da aplicação que envia arquivos.
    Estou tendo muita dificuldade para enviar um arquivo, de qualquer tipo, via Socket.
    Você poderia postar um exemplo?

    Outra dúvida…

    Como eu poderia utilizar um Timer para atualizar a leitura do Cliente/Servidor remoto?

    Aguardo sua resposta.
    Grato pela atenção.
    Adriano.

    1. Olá, Adriano, tudo certo?
      Ainda não tenho um exemplo e nem um artigo sobre sockets, mas pretendo adicionar esse tema na pauta.
      Assim que possível, publicarei algo relacionado, ok?

      Abraço!

  5. Olá André, tudo bem?
    Parabéns pelo belíssimo trabalho.
    Estou tendo dificuldades com o esse artigo: http://www.andrecelestino.com/delphi-funcionalidade-de-atualizacao-automatica-parte-1/
    Delphi – Atualização Automática – Parte 1 – André Celestino
    Primeira parte do tutorial sobre como implementar a funcionalidade de atualização automática pelo Delphi utilizando arquivos INI e o componente TIdFTP.
    andrecelestino.com
    Gostaria muito de solucionar os problemas que estou tendo (Delphi 7).
    Erro: [Error] Unit1.pas(135): Incompatible types: ‘WideChar’ and ‘Char’
    Nessa linha: sNomeArquivoAtualizacao +’ -o’ + ObterDiretorioDoExecutavel), ”, SW_SHOW);
    Obrigado desde já.
    Abs
    Jack Lima

  6. Parabéns! Dias atrás comprei um componente e não me agradei muito. Irei implementar em meus projetos.

  7. Parabéns ótimo artigo. Eu poderia fazer um parecido. Tenho uma aplicação que tem um banco de dados SQL Server e queria saber como é possível automatizar a atualização do banco de dados.

    1. Olá, Erasmo, tudo bem?
      Com o SQL Server, você pode usar o sqlcmd. Trata-se de um utilitário de linha de comando que permite aplicar ações em um banco de dados, como executar um script. O seu atualizador automático, portanto, poderia chamar este utilitário automaticamente, indicando o arquivo de script que foi baixado na atualização.
      Na verdade, é bem parecido com a atualização de bancos de dados Firebird, no qual utiliza-se o utilitário isql.

      Abraço!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Preencha o campo abaixo * Time limit is exhausted. Please reload CAPTCHA.