Ir para o conteúdo principal

Atualizando Aplicativos

Existem várias maneiras de fornecer atualizações automáticas para seu aplicativo Electron. A maneira mais fácil, suportada oficialmente é utilizando o framework embutido Squirrel e o módulo autoUpdater do Electron.

Using update.electronjs.org

A equipe do Electron mantém update.electronjs.org, um webservice gratuito e de código aberto que os aplicativos Electron podem usar para se auto-atualizar. O serviço é destinado para apps Electron que atendem os seguintes critérios:

  • O app roda no macOS ou no Windows
  • O app tem um repositório GitHub público
  • Builds são publicadas em GitHub Releases
  • Builds são code-signed

A forma mais fácil de usar este serviço é instalando o update-electron-app, um módulo Node.js pre-configurado para ser usado com update.electronjs.org.

Instale o módulo usando seu gerenciador de pacotes Node.js de preferência:

npm install update-electron-app

Em seguida, importe o pacote do atualizador no arquivo principal do projeto:

main.js
require('update-electron-app')()

Por padrão, este módulo irá verificar atualizações na inicialização do aplicativo, e a cada dez minutos. Quando uma atualização for encontrada, ela será baixada automaticamente em segundo plano. Quando o download é concluído, uma caixa de diálogo será exibida permitindo que o usuário reinicie o aplicativo.

Se precisar personalizar sua configuração, você pode passar argumentos para o update-electron-app ou usar o serviço de atualização diretamente.

Usando outros serviços de atualização

Se você estiver desenvolvendo um aplicativo Electron privado, ou se não é publicado versões no GitHub Releases, pode ser necessário executar o seu próprio servidor de atualização.

Passo 1: Implementando um servidor de atualização

Dependendo de suas necessidades, você pode escolher um destes:

  • Hazel – Servidor de Atualização para aplicativos privados ou de código aberto que podem ser implantados gratuitamente na Vercel. Ele puxa do GitHub Releases e utiliza o poder dos GitHub CDN.
  • Nuts - Também usar GitHub Releases, mas armazena em cache as atualizações do app no disco e suporta repositórios.
  • electron-resease-server - Fornece um painel para a manipulação de versões e não requer lançamentos que se originam do GitHub.
  • Nucleus - Um servidor de atualização completo para Electron apps mantido pela Atlassian. Suporta múltiplas aplicações e canais; usar um armazenamento de arquivo estático para diminuir o custo do servidor.

Uma vez que você fez o deploy do seu servidor de atualizações, você pode modificar o código do seu app para receber e aplicar as atualizações com o módulo [autoUpdater] do Electron.

Passo 2: Recebendo atualizações no seu app

Primeiro, importe os módulos necessários no arquivo principal do projeto. O código a seguir pode variar para diferentes softwares de servidor, mas ele funciona como descrito ao usar o Hazel.

Verifique seu ambiente de execução!

Por favor, certifique-se de que o código abaixo será executado apenas no seu aplicativo empacotado, e não em desenvolvimento. Você pode usar a API app.isPackaged para verificar o ambiente.

main.js
const { app, autoUpdater, dialog } = require('electron')

Em seguida, construa a URL do feed do servidor de atualização e informe ao autoUpdater sobre ele:

main.js
const server = 'https://your-deployment-url.com'
const url = `${server}/update/${process.platform}/${app.getVersion()}`

autoUpdater.setFeedURL({ url })

Como etapa final, verifique se há atualizações. O exemplo abaixo irá verificar a cada minuto:

main.js
setInterval(() => {
autoUpdater.checkForUpdates()
}, 60000)

Assim que sua aplicação for empacotada, ela receberá uma atualização para cada novo GitHub Release que você publicar.

Passo 3: Notificando os usuários quando atualizações estiverem disponíveis

Agora que você configurou um Sistema de Atualização básico para sua aplicação, você precisa garantir que o usuário será notificado quando houver uma atualização. Isto pode ser realizado usando os eventos da API do AutoUpdater:

main.js
autoUpdater.on('update-downloaded', (event, releaseNotes, releaseName) => {
const dialogOpts = {
type: 'info',
buttons: ['Reiniciar', 'Mais Tarde'],
title: 'Atualização Disponivel',
message: process.platform === 'win32' ? releaseNotes : releaseName,
detail:
'Uma nova versão foi Baixada. Reinicie o Aplicativo para Instalar as Atualizações.',
}

dialog.showMessageBox(dialogOpts).then((returnValue) => {
if (returnValue.response === 0) autoUpdater.quitAndInstall()
})
})

Certifique-se também de que os erros estão sendo tratados. Segue um exemplo como debugar e enviar para o stderr:

main.js
autoUpdater.on('error', (message) => {
console.error('Ocorreu um erro ao atualizar o aplicativo')
console.error(message)
})
Manipulando atualizações manualmente

Como as solicitações feitas pelo autoUpdate não estão sob seu controle direto, você pode encontrar situações difíceis ao manusear (como caso o servidor de atualização estiver por trás de uma autenticação). O campo url suporta o protocolo file://, o que significa que, com algum esforço, você pode evitar o aspecto de comunicação do servidor do processo, enviando sua atualização a partir de um diretório local. Aqui está um exemplo de como isso pode funcionar.