Firma y notariza tu app de Mac con Electron o Tauri desde Windows o Linux
Puedes escribir una app de Electron o Tauri en Windows o Linux. La versión para macOS es otra cosa. Las herramientas de firma y notarización de Apple solo funcionan en macOS. Sin ellas, los usuarios de Mac ven un aviso y la app no se abre. Esta página muestra los pasos de compilar, firmar y notarizar, con comandos que ejecutamos.
Por qué el paso del Mac necesita macOS
Tres herramientas de Apple hacen el trabajo. codesign firma la app. notarytool la envía al servicio de notarización de Apple. stapler adjunta el ticket que Apple devuelve. Las tres vienen con macOS y Xcode. Apple no tiene versión para Windows ni para Linux.
La documentación de los frameworks coincide. Tauri dice que ejecutes tauri build en un ordenador Mac. Electron Forge dice que Xcode es obligatorio para notarizar. También probamos el lado de Linux en GitHub Actions. Electron Forge en Ubuntu creó un .deb y un .rpm. Al pedirle un paquete de macOS, falló.
Qué necesitas antes del día de la versión
- Una membresía de pago del Apple Developer Program. Apple indica 99 USD al año.
- Un certificado Developer ID Application. Solo el Account Holder del equipo puede crearlo, en Xcode o en el sitio de desarrolladores.
- Una contraseña específica de app para tu cuenta de Apple, o una clave de API de App Store Connect.
- Tu Team ID, el código de 10 caracteres de tu cuenta de desarrollador.
El servicio de notarización de Apple también pide el hardened runtime y una marca de tiempo segura. electron-builder activa el hardened runtime con una línea en su configuración, como se ve abajo.
Cómo es una build sin firma
Compilamos la plantilla oficial de create-tauri-app sin certificado. Estas son las comprobaciones que hicimos sobre el 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"
La salida en un runner macos-26 de GitHub:
x86_64 arm64 tauri-app.app: code object is not signed at all tauri-app.app: rejected source=no usable signature
La build tardó 4 minutos. Creó un .app universal de 8.23 MiB y un .dmg de 3.57 MiB. El .dmg de Electron Forge no fue mejor. codesign mostró Signature=adhoc y TeamIdentifier=not set, y spctl lo rechazó. Gatekeeper bloquea builds como estas en los Macs de tus usuarios.
Electron Forge: firma y notariza en make
Forge firma y notariza durante npm run make cuando la configuración lo pide. Este es el ejemplo de la guía de firma para macOS de 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
}
}
};Después compila cada arquitectura. Primero añadimos el maker de DMG a la plantilla por defecto. Cada build tardó menos de 25 segundos:
npm install --save-dev @electron-forge/maker-dmg npm run make -- --arch=arm64 npm run make -- --arch=x64
También probamos --arch=universal con la plantilla por defecto. Falló con "the number of mach-o files is not the same between the arm64 and x64 builds". La documentación de electron-builder también dice que las builds por arquitectura son las más fiables.
electron-builder: notarize: true
electron-builder lee el certificado y el acceso de Apple de variables de entorno. Su página de notarización muestra esta configuración:
# 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: define las variables y compila
Tauri firma y notariza dentro de tauri build cuando estas variables están definidas. Los nombres salen de la guía de firma para macOS de 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
Notariza cualquier app a mano
Para otros toolkits, o para repetir un paso, ejecuta tú mismo las herramientas de Apple. Estos comandos salen de la documentación de notarización de Apple. Guarda tu acceso una vez y luego comprime, envía y espera:
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"
Apple dice que la notarización suele tardar menos de una hora. No puedes grapar el ticket a un ZIP, así que grápalo al .app y vuelve a comprimirlo. También puedes enviar y grapar el propio .dmg. Si el estado es Invalid, lee el log:
xcrun notarytool log <submission-id> --keychain-profile "notarytool-password" developer_log.json
Hacerlo en un Mac alquilado
Un pase de un día de MacRun es un Mac mini M6 dedicado por $15. Xcode 27.1 está instalado, así que codesign, notarytool y stapler están listos. Node y Rust no vienen preinstalados. Tienes acceso admin y Homebrew, así que puedes instalarlos tú.
- Conéctate por Tailscale con SSH, o abre el escritorio con cualquier visor VNC.
- Inicia sesión en Xcode con tu cuenta de Apple y crea ahí el certificado Developer ID.
- Exporta el certificado con su clave a un archivo .p12 y guárdalo, para CI más adelante.
- Clona tu repo, compila, notariza y descarga el .dmg con el ticket grapado.
El Mac se borra cuando termina el pase. Sube tu código y copia antes el .p12. Para usar Xcode con una pantalla remota, consulta nuestra guía de Xcode desde Windows.
Quién no debería alquilar un Mac para esto
- Equipos que ya tienen CI. Un runner de macOS de GitHub puede firmar y notarizar con secretos. Nuestro job de Electron se cobró como 2 minutos, unos 12 centavos. El job de Tauri se cobró como 5, unos 31 centavos. La espera de la notarización añade minutos. Consulta nuestra guía de GitHub Actions.
- Pipelines solo de Linux. rcodesign es una herramienta de código abierto que firma y notariza desde Linux o Windows. Necesita una clave de API de App Store Connect. No es una herramienta de Apple, y su última versión fue la 0.29.0, en noviembre de 2024.
- Versiones cada semana. Un runner mensual cuesta $104 el primer mes y después $139 al mes. Comprar un Mac usado puede salir más barato en un año.
Preguntas frecuentes
¿Puedo notarizar una app de Mac en Windows?
+
No con las herramientas de Apple. codesign, notarytool y stapler solo funcionan en macOS. La herramienta de código abierto rcodesign puede firmar y notarizar desde Windows o Linux, pero Apple no la crea ni le da soporte.
¿Necesito una cuenta de pago de Apple Developer para notarizar?
+
Sí. Necesitas un certificado Developer ID Application, que viene con el Apple Developer Program por 99 USD al año. La documentación de Tauri dice que una cuenta gratuita no puede notarizar.
¿Puede Electron Forge crear un .dmg de Mac en Linux?
+
En nuestra prueba, no. Electron Forge en Ubuntu solo creó un .deb y un .rpm, y forzar un paquete de macOS falló. En un runner de macOS 26, la misma plantilla creó un .dmg y un .zip para arm64 y x64.
¿Cómo hago una build universal para Mac?
+
Con Tauri, añade los dos targets de Rust y ejecuta tauri build --target universal-apple-darwin. Eso nos dio un solo .app con x86_64 y arm64. Con Electron Forge, la plantilla por defecto no pudo combinarlas, así que compila arm64 y x64 por separado.
¿Cuánto tarda la notarización de Apple?
+
Apple dice que suele tardar menos de una hora. La opción --wait mantiene notarytool en marcha hasta que Apple responde, así que no tienes que ir preguntando.
¿Cuánto cuesta un Mac para una sola versión?
+
Un pase de un día de MacRun cuesta $15 por un Mac mini M6 dedicado con Xcode instalado. Una semana cuesta $59. Pagas una sola vez y no se renueva nada.