Empacotamento para macOS
Empacote seu aplicativo Wails para distribuição no macOS
APIs privadas do macOS
Por padrão, o Wails v3 usa APIs públicas do macOS. Para habilitar recursos que exigem APIs não documentadas da Apple, compile seu aplicativo com a única tag de compilação do Go private_mac_apis:
wails3 build -tags private_mac_apis
EXTRA_TAGS=private_mac_apis wails3 dev
wails3 package GOOS=darwin EXTRA_TAGS=private_mac_apis
Para uma compilação direta com o Go, use go build -tags private_mac_apis . (ou -tags production,private_mac_apis para produção). Aplicativos existentes que dependem de comportamentos privados devem adicionar essa tag para mantê-los. A tag se aplica apenas a compilações de desktop para macOS.
Consulte APIs privadas do macOS para ver a lista completa dos recursos e valores de opções afetados, os comportamentos alternativos exatos das compilações públicas, os mapeamentos de estilo do Liquid Glass e as combinações de compilação do inspetor. Sem a tag, as operações exclusivas das APIs privadas não realizam nenhuma ação; a API pública do Go permanece inalterada.
Pacote do aplicativo
Empacote seu aplicativo como um pacote .app padrão do macOS:
wails3 package GOOS=darwin
Isso cria bin/<AppName>.app, que contém:
- O binário compilado em
Contents/MacOS/ - O ícone do aplicativo em
Contents/Resources/(proveniente deicons.icnsou, quando presente, de um catálogo de recursosAssets.car) Info.plistcom os metadados do aplicativo
Projetos em pastas sincronizadas
Alguns provedores de arquivos do macOS adicionam metadados do Finder aos diretórios .app e fazem com que o codesign rejeite o pacote ou invalidam sua assinatura após a assinatura. Apenas remover os metadados não é suficiente quando o provedor os adiciona novamente.
As tarefas de compilação geradas para macOS verificam esse comportamento. Quando ele é detectado, o Wails move o diretório de saída gerado do projeto para ~/Library/Application Support/Wails/build-output/<project>-<hash> e substitui o diretório de saída original por um link simbólico. Os arquivos de saída existentes são preservados, e bin/<AppName>.app continua sendo o caminho usado para empacotamento, assinatura e modo de desenvolvimento. A CLI informa o local de armazenamento quando realiza a movimentação.
Defina WAILS_MACOS_OUTPUT_ROOT para escolher outro local de armazenamento local e não sincronizado. O diretório raiz de destino deve estar no mesmo sistema de arquivos que o projeto. Um BIN_DIR explicitamente definido fora do projeto é usado conforme configurado. Projetos existentes precisam do arquivo build/darwin/Taskfile.yml atualizado para usar esse tratamento.
Para distribuir o aplicativo, copie bin/<AppName>.app ou crie um DMG. Copiar apenas o link simbólico bin não inclui os artefatos da compilação. O comando direto wails3 tool sign informa um erro se a pasta de entrada adicionar os metadados novamente; mova esse pacote para uma pasta não sincronizada antes de assiná-lo.
Recursos do pacote
Contents/Resources/ é o local padrão para arquivos somente leitura distribuídos com um aplicativo macOS. Use-o para modelos maiores, dados iniciais, mídia, pacotes de idiomas ou outros conteúdos que devam ser abertos sob demanda, em vez de compilados no executável Go com embed.
O Wails já coloca o ícone do aplicativo nesse diretório. Para adicionar seus próprios arquivos, coloque-os em um diretório de origem, como build/resources/, e adicione uma etapa de cópia à tarefa create:app:bundle em build/darwin/Taskfile.yml:
tasks:
create:app:bundle:
cmds:
# Existing bundle creation commands...
- |
if [ -d build/resources ]; then
cp -R build/resources/. "{{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/Resources/"
fiSe você usa a tarefa darwin:run do Taskfile, adicione o comando equivalente à tarefa run correspondente, tendo {{.BIN_DIR}}/{{.APP_NAME}}.dev.app/Contents/Resources/ como destino.
Leitura de recursos no Go
Importe o pacote da plataforma macOS:
import (
"io/fs"
"github.com/wailsapp/wails/v3/pkg/mac"
)Para arquivos pequenos, use LoadResource:
func loadSplash() ([]byte, error) {
return mac.LoadResource("images/splash.png")
}Para arquivos maiores, use ResourceFS. Essa função retorna um io/fs.FS cuja raiz é Contents/Resources, permitindo que os chamadores abram e transmitam um recurso sem antes carregá-lo por completo em um slice de bytes do Go:
func openCatalogue() (fs.File, error) {
resources, err := mac.ResourceFS()
if err != nil {
return nil, err
}
return resources.Open("catalogue/defaults.json")
}Os nomes dos recursos são caminhos separados por barras, relativos a Contents/Resources. ResourceFS e LoadResource retornam mac.ErrNotInAppBundle, a menos que o executável seja executado a partir de .app/Contents/MacOS.
Trate os recursos do pacote como imutáveis. Alterar arquivos dentro de um aplicativo assinado invalida sua assinatura de código; em vez disso, armazene dados baixados, gerados ou editáveis pelo usuário no diretório Application Support do usuário.
Binário universal
Compile para Macs com Apple Silicon e Intel:
wails3 task darwin:package:universal
Isso cria um único .app que é executado nativamente nas duas arquiteturas. Binários universais podem ser compilados em qualquer plataforma — no Linux e no Windows, wails3 tool lipo é usado automaticamente.
Personalização do pacote
Edite build/darwin/Info.plist para personalizar:
- Identificador do pacote (
CFBundleIdentifier) - Nome e versão do aplicativo
- Versão mínima do macOS
- Associações de arquivos
- Esquemas de URL
O ícone do aplicativo é gerado a partir dos recursos no diretório build/. Use a tarefa generate:icons:
wails3 task common:generate:icons
Isso usa build/appicon.png para gerar darwin/icons.icns e windows/icon.ico. No macOS, você também pode fornecer build/appicon.icon (formato do Icon Composer): a tarefa passa -iconcomposerinput appicon.icon -macassetdir darwin, que gera Assets.car e darwin/icons.icns a partir do arquivo .icon (essa etapa é ignorada em plataformas que não sejam macOS). Quando Assets.car estiver presente, execute a tarefa update:build-assets para que Info.plist e CFBundleIconName sejam atualizados de acordo:
wails3 task common:update:build-assets
Para executar manualmente o comando de ícone a partir do diretório build/:
cd build
wails3 generate icons -input appicon.png -macfilename darwin/icons.icns -windowsfilename windows/icon.ico -iconcomposerinput appicon.icon -macassetdir darwin
Assinatura de código
Assine seu aplicativo para distribuição:
# Using the wrapper (auto-detects platform)
wails3 sign GOOS=darwin
# Or using the task directly
wails3 task darwin:sign
Configure a assinatura em build/darwin/Taskfile.yml:
vars:
SIGN_IDENTITY: "Developer ID Application: Your Company (TEAMID)"
ENTITLEMENTS: "build/darwin/entitlements.plist"Notarização
Para aplicativos distribuídos fora da Mac App Store, a Apple exige notarização:
wails3 task darwin:sign:notarize
Primeiro, armazene suas credenciais. Execute o assistente interativo (wails3 setup signing) ou chame notarytool diretamente:
xcrun notarytool store-credentials "my-notarize-profile" \
--apple-id "you@email.com" \
--team-id "TEAMID" \
--password "app-specific-password"
Configure em build/darwin/Taskfile.yml:
vars:
SIGN_IDENTITY: "Developer ID Application: Your Company (TEAMID)"
KEYCHAIN_PROFILE: "my-notarize-profile"Consulte Assinatura de aplicativos para obter detalhes.
Instalador DMG
O modelo fornecido com o Wails 3 disponibiliza wails3 task darwin:package:dmg. Primeiro, ele cria o .app e depois gera um DMG estilizado com a biblioteca DMG. Por padrão, o DMG usa um plano de fundo em degradê com a identidade visual do Wails, contendo o símbolo do dragão vermelho e o logotipo textual WAILS.
wails3 task darwin:package:dmg
A tarefa de nível mais baixo darwin:create:dmg cria um DMG a partir de um pacote .app existente e pode ser configurada diretamente no Taskfile:
vars:
# These are the template defaults; override them when needed.
DMG_BACKGROUND: build/darwin/dmg-background.png
DMG_VOLUME_ICON: build/darwin/icons.icns
DMG_FILE_ICON: build/darwin/dmg-file-icon.icns
DMG_WINDOW_WIDTH: 540
DMG_WINDOW_HEIGHT: 380
DMG_FILES: "Install.command=build/darwin/Install.command,README.txt=README.md"Layout padrão
O DMG gerado contém:
- O pacote do aplicativo à esquerda
- Um link para
Applicationsà direita - Uma janela do Finder com 540 × 380 pixels
- Ícones com 96 pontos e rótulos abaixo de cada ícone
- O plano de fundo com a identidade visual do Wails proveniente de
build/darwin/dmg-background.png
Os ícones do aplicativo e de Applications são posicionados em relação às dimensões configuradas da janela. Assim, ao alterar DMG_WINDOW_WIDTH ou DMG_WINDOW_HEIGHT, o espaçamento proporcional do layout padrão de dois ícones é mantido. Para obter o melhor resultado, use uma imagem de fundo com as mesmas dimensões em pixels da janela do Finder.
Substituição dos recursos do DMG
Os arquivos gerados em build/darwin/ são recursos comuns do projeto e podem ser substituídos:
DMG_BACKGROUNDcontrola a imagem exibida atrás do conteúdo da janela do Finder.DMG_VOLUME_ICONcontrola o ícone exibido para o volume montado.DMG_FILE_ICONcontrola o ícone exibido no Finder para o arquivo.dmgresultante.
O ícone do volume e o ícone do arquivo DMG são recursos separados. Substituir o ícone do aplicativo não substitui automaticamente nenhum deles.
Como adicionar arquivos extras
Use DMG_FILES para incluir scripts do instalador, notas de versão, licenças ou outros recursos junto ao aplicativo. O valor é uma lista de pares name=path separados por vírgulas:
vars:
DMG_FILES: "Install.command=build/darwin/Install.command,README.txt=README.md"O nome antes de = é o nome de arquivo exibido dentro do DMG. O caminho depois de = corresponde ao arquivo de origem no projeto. Os espaços em branco no início e no fim são ignorados.
Cada nome exibido deve ser único. Os arquivos extras não podem substituir entradas já criadas pelo empacotador, incluindo o pacote do aplicativo ou a entrada Applications. Em caso de conflito de nomes, o empacotamento falha com um erro, em vez de produzir um DMG corrompido.
Solução de problemas
“O app está danificado e não pode ser aberto”
O app não está assinado. Assine-o com um certificado Developer ID ou, alternativamente, os usuários podem ignorar o Gatekeeper:
xattr -cr /path/to/YourApp.app
Falha na notarização
Problemas comuns:
- Credenciais inválidas: execute
xcrun notarytool store-credentialsnovamente (ouwails3 setup signing) - Runtime reforçado obrigatório: verifique se os entitlements incluem
com.apple.security.cs.allow-unsigned-executable-memory, caso necessário - Carimbo de data e hora ausente: o processo de assinatura deve incluir automaticamente um carimbo de data e hora
O app compilado de forma cruzada não é executado
Os binários do macOS compilados de forma cruzada não são assinados. Transfira-os para um Mac e assine-os antes de testar:
codesign --force --deep --sign - YourApp.app