Firmado en macOS
Pasos de firmado para builds de depuración de macOS generados por scripts de empaquetado
Esta app usualmente se construye desde ''''scripts/package-mac-app.sh'''', que ahora:
- establece un bundle identifier de depuración estable: ''ai.openclaw.mac.debug''
- escribe Info.plist con ese bundle id (sobrescribir vía ''BUNDLE_ID=...'')
- llama a ''''scripts/codesign-mac-app.sh'''' para firmar el binario principal y el bundle de la app para que macOS trate cada reconstrucción como el mismo bundle firmado y mantiene los permisos TCC (notificaciones, accesibilidad, grabación de pantalla, micrófono, voz). Para permisos estables, usa una identidad de firmado real; ad-hoc es opt-in y frágil (ver ''permisos macOS'').
- usa ''CODESIGN_TIMESTAMP=auto'' por defecto; habilita timestamps confiables para firmas Developer ID. Establece ''CODESIGN_TIMESTAMP=off'' para omitir timestamping (builds de depuración offline).
- inyecta metadatos de build en Info.plist: ''OpenClawBuildTimestamp'' (UTC) y ''OpenClawGitCommit'' (hash corto) para que el panel About pueda mostrar build, git, y canal debug/release.
- El empaquetado requiere Node 22+: el script ejecuta builds TS y build de Control UI.
- lee ''SIGN_IDENTITY'' del entorno. Agrega ''export SIGN_IDENTITY="Apple Development: Tu Nombre (TEAMID)"'' (o tu certificado Developer ID Application) a tu shell rc para siempre firmar con tu certificado. El firmado ad-hoc requiere opt-in explícito vía ''ALLOW_ADHOC_SIGNING=1'' o ''SIGN_IDENTITY="-"'' (no recomendado para pruebas de permisos).
- ejecuta una auditoría de Team ID después de firmar y falla si algún Mach-O dentro del bundle de la app está firmado por un Team ID diferente. Establece ''SKIP_TEAM_ID_CHECK=1'' para omitir.
Uso
scripts/package-mac-app.sh # auto-selecciona identidad; error si no encuentra ninguna SIGN_IDENTITY="Developer ID Application: Tu Nombre" scripts/package-mac-app.sh # cert real ALLOW_ADHOC_SIGNING=1 scripts/package-mac-app.sh # ad-hoc (permisos no persistirán) SIGN_IDENTITY="-" scripts/package-mac-app.sh # ad-hoc explícito (mismo caveat) DISABLE_LIBRARY_VALIDATION=1 scripts/package-mac-app.sh # workaround dev-only para mismatch de Team ID de Sparkle
#
Nota sobre Firmado Ad-hoc
Al firmar con ''SIGN_IDENTITY="-"'' (ad-hoc), el script automáticamente deshabilita ''Hardened Runtime'' (''--options runtime''). Esto es necesario para prevenir crashes cuando la app intenta cargar frameworks embebidos (como Sparkle) que no comparten el mismo Team ID. Las firmas ad-hoc también rompen la persistencia de permisos TCC; ver ''permisos macOS'' para pasos de recuperación.
Metadatos de build para About
''package-mac-app.sh'' estampa el bundle con:
- ''OpenClawBuildTimestamp'': ISO8601 UTC al momento del empaquetado
- ''OpenClawGitCommit'': hash corto de git (o ''unknown'' si no disponible)
La pestaña About lee estas claves para mostrar versión, fecha de build, commit de git, y si es un build de depuración (vía ''#if DEBUG''). Ejecuta el empaquetador para refrescar estos valores después de cambios de código.
Por qué
Los permisos TCC están vinculados al bundle identifier _y_ a la firma de código. Los builds de depuración sin firmar con UUIDs cambiantes causaban que macOS olvidara las concesiones después de cada reconstrucción. Firmar binarios (ad-hoc por defecto) y mantener un bundle id/ruta fijo (''dist/OpenClaw.app'') preserva las concesiones entre builds, coincidiendo con el enfoque de VibeTunnel.