Assine e notarize seu app de Mac em Electron ou Tauri a partir do Windows ou do Linux
Você pode escrever um app Electron ou Tauri no Windows ou no Linux. A versão para macOS é diferente. As ferramentas de assinatura e notarização da Apple só rodam no macOS. Sem elas, quem usa Mac vê um aviso e o app não abre. Esta página mostra as etapas de build, assinatura e notarização, com os comandos que rodamos.
Por que a etapa do Mac precisa do macOS
Três ferramentas da Apple fazem o trabalho. O codesign assina o app. O notarytool envia o app para o serviço de notarização da Apple. O stapler anexa o ticket que a Apple devolve. As três vêm com o macOS e o Xcode. Não existe versão da Apple para Windows ou Linux.
A documentação dos frameworks concorda. O Tauri diz para rodar o tauri build em um computador Mac. O Electron Forge diz que o Xcode é obrigatório para a notarização. Também testamos o lado Linux no GitHub Actions. O Electron Forge no Ubuntu gerou um .deb e um .rpm. Pedir um pacote para macOS falhou.
O que você precisa antes do dia do lançamento
- Uma assinatura paga do Apple Developer Program. A Apple informa 99 USD por ano.
- Um certificado Developer ID Application. Só o Account Holder do time pode criar um, no Xcode ou no site de desenvolvedores.
- Uma senha específica de app para a sua Apple Account, ou uma chave de API do App Store Connect.
- Seu Team ID, o código de 10 caracteres da sua conta de desenvolvedor.
O serviço de notarização da Apple também pede o hardened runtime e um carimbo de tempo seguro. O electron-builder liga o hardened runtime com uma linha na configuração, mostrada abaixo.
Como fica um build sem assinatura
Fizemos o build do template oficial do create-tauri-app sem certificado. Estas são as verificações que rodamos no resultado:
npm create tauri-app@latest tauri-app -- --template vanilla --manager npm --yes cd tauri-app && npm install rustup target add aarch64-apple-darwin x86_64-apple-darwin npm run tauri build -- --target universal-apple-darwin APP=src-tauri/target/universal-apple-darwin/release/bundle/macos/tauri-app.app lipo -archs "$APP"/Contents/MacOS/* codesign --verify --deep --strict --verbose=2 "$APP" spctl -a -vv "$APP"
A saída em um runner macos-26 do GitHub:
x86_64 arm64 tauri-app.app: code object is not signed at all tauri-app.app: rejected source=no usable signature
O build levou 4 minutos. Ele gerou um .app universal de 8.23 MiB e um .dmg de 3.57 MiB. O .dmg do Electron Forge não foi melhor. O codesign mostrou Signature=adhoc e TeamIdentifier=not set, e o spctl o rejeitou. O Gatekeeper bloqueia builds assim nos Macs dos seus usuários.
Electron Forge: assine e notarize no make
O Forge assina e notariza durante o npm run make quando a configuração pede. Este é o exemplo do guia de assinatura para macOS do Forge:
// forge.config.js
module.exports = {
packagerConfig: {
osxSign: {},
osxNotarize: {
appleId: process.env.APPLE_ID,
appleIdPassword: process.env.APPLE_PASSWORD,
teamId: process.env.APPLE_TEAM_ID
}
}
};Depois faça o build de cada arquitetura. Antes, adicionamos o maker de DMG ao template padrão. Cada um dos dois builds levou menos de 25 segundos:
npm install --save-dev @electron-forge/maker-dmg npm run make -- --arch=arm64 npm run make -- --arch=x64
Também tentamos --arch=universal no template padrão. Falhou com "the number of mach-o files is not the same between the arm64 and x64 builds". A documentação do electron-builder também diz que builds separados por arquitetura são os mais confiáveis.
electron-builder: notarize: true
O electron-builder lê o certificado e o login da Apple de variáveis de ambiente. A página de notarização dele mostra esta configuração:
# electron-builder.yml
mac:
notarize: true
sign:
hardenedRuntime: true
# environment
CSC_LINK=/path/to/developer-id.p12
CSC_KEY_PASSWORD=...
APPLE_ID=you@example.com
APPLE_APP_SPECIFIC_PASSWORD=xxxx-xxxx-xxxx-xxxx
APPLE_TEAM_ID=ABCDE12345Tauri: defina as variáveis e faça o build
O Tauri assina e notariza dentro do tauri build quando estas variáveis estão definidas. Os nomes vêm do guia de assinatura para macOS do Tauri:
export APPLE_SIGNING_IDENTITY="Developer ID Application: Your Name (ABCDE12345)" export APPLE_ID=you@example.com export APPLE_PASSWORD=xxxx-xxxx-xxxx-xxxx export APPLE_TEAM_ID=ABCDE12345 npm run tauri build -- --target universal-apple-darwin
Notarize qualquer app na mão
Para outros toolkits, ou para refazer uma etapa, rode você mesmo as ferramentas da Apple. Estes comandos vêm da documentação de notarização da Apple. Salve seu login uma vez, depois compacte, envie e espere:
xcrun notarytool store-credentials "notarytool-password" \ --apple-id "you@example.com" --team-id ABCDE12345 \ --password xxxx-xxxx-xxxx-xxxx ditto -c -k --keepParent "MyApp.app" "MyApp.zip" xcrun notarytool submit MyApp.zip --keychain-profile "notarytool-password" --wait xcrun stapler staple "MyApp.app"
A Apple diz que a notarização normalmente leva menos de uma hora. Não dá para aplicar o ticket com stapler em um ZIP, então aplique no .app e compacte de novo. Você também pode enviar o próprio .dmg e aplicar o ticket nele. Se o status for Invalid, leia o log:
xcrun notarytool log <submission-id> --keychain-profile "notarytool-password" developer_log.json
Fazer isso em um Mac alugado
Um passe diário da MacRun é um Mac mini M6 dedicado por $15. O Xcode 27.1 está instalado, então o codesign, o notarytool e o stapler estão prontos. Node e Rust não vêm pré-instalados. Você tem direitos de administrador e Homebrew, então pode instalá-los você mesmo.
- Conecte pelo Tailscale com SSH, ou abra a área de trabalho com qualquer visualizador VNC.
- Entre no Xcode com sua Apple Account e crie o certificado Developer ID ali.
- Exporte o certificado com a chave para um arquivo .p12 e guarde, para usar no CI depois.
- Clone seu repositório, faça o build, notarize e baixe o .dmg com o ticket aplicado.
O Mac é apagado quando o passe termina. Envie seu código e copie o .p12 antes. Para usar o Xcode por uma tela remota, veja nosso guia Xcode a partir do Windows.
Quem não deve alugar um Mac para isso
- Times que já têm CI. Um runner macOS do GitHub consegue assinar e notarizar com secrets. Nosso job do Electron foi cobrado como 2 minutos, cerca de 12 centavos de dólar. O job do Tauri foi cobrado como 5, cerca de 31 centavos. A espera da notarização soma minutos. Veja nosso guia do GitHub Actions.
- Pipelines só com Linux. O rcodesign é uma ferramenta de código aberto que assina e notariza a partir do Linux ou do Windows. Ele precisa de uma chave de API do App Store Connect. Não é uma ferramenta da Apple, e a última versão foi a 0.29.0, em novembro de 2024.
- Lançamentos semanais. Um plano runner mensal custa $104 no primeiro mês e depois $139 por mês. Comprar um Mac usado pode sair mais barato em um ano.
Perguntas frequentes
Posso notarizar um app de Mac no Windows?
+
Não com as ferramentas da Apple. O codesign, o notarytool e o stapler só rodam no macOS. A ferramenta de código aberto rcodesign consegue assinar e notarizar a partir do Windows ou do Linux, mas a Apple não a cria nem dá suporte a ela.
Preciso de uma conta paga de Apple Developer para notarizar?
+
Sim. Você precisa de um certificado Developer ID Application, que vem com o Apple Developer Program por 99 USD por ano. A documentação do Tauri diz que uma conta grátis não consegue notarizar.
O Electron Forge consegue gerar um .dmg de Mac no Linux?
+
No nosso teste, não. O Electron Forge no Ubuntu gerou só um .deb e um .rpm, e um pacote macOS forçado falhou. Em um runner macOS 26, o mesmo template gerou um .dmg e um .zip para arm64 e x64.
Como faço um build universal para Mac?
+
Com o Tauri, adicione os dois targets do Rust e rode tauri build --target universal-apple-darwin. Isso nos deu um único .app com x86_64 e arm64. Com o Electron Forge, o template padrão falhou ao juntar as arquiteturas, então faça o build de arm64 e x64 separados.
Quanto tempo leva a notarização da Apple?
+
A Apple diz que normalmente leva menos de uma hora. A flag --wait mantém o notarytool rodando até a Apple responder, então você não precisa ficar consultando.
Quanto custa um Mac para um lançamento?
+
Um passe diário da MacRun custa $15 por um Mac mini M6 dedicado com o Xcode instalado. Uma semana custa $59. Você paga uma vez e nada se renova.