macOS companion app
Firma de macOS
firma de mac (compilaciones de depuración)
Esta app se compila normalmente desde scripts/package-mac-app.sh, que ahora:
- establece un identificador de paquete de depuración estable:
ai.openclaw.mac.debug - escribe el Info.plist con ese id de paquete (sobrescríbelo mediante
BUNDLE_ID=...) - llama a
scripts/codesign-mac-app.shpara firmar el binario principal y el paquete de la app, de modo que macOS trate cada recompilación como el mismo paquete firmado y conserve los permisos de TCC (notificaciones, accesibilidad, grabación de pantalla, micrófono, voz). Para permisos estables, usa una identidad de firma real; ad hoc es optativo y frágil (consulta permisos de macOS). - usa
CODESIGN_TIMESTAMP=autode forma predeterminada; habilita marcas de tiempo de confianza para firmas de Developer ID. EstableceCODESIGN_TIMESTAMP=offpara omitir la marca de tiempo (compilaciones de depuración sin conexión). - inyecta metadatos de compilación en Info.plist:
OpenClawBuildTimestamp(UTC) yOpenClawGitCommit(hash corto) para que el panel Acerca de pueda mostrar la compilación, git y el canal de depuración/lanzamiento. - El empaquetado usa Node 24 de forma predeterminada: el script ejecuta compilaciones TS y la compilación de Control UI. Node 22 LTS, actualmente
22.19+, sigue siendo compatible. - lee
SIGN_IDENTITYdesde el entorno. Añadeexport SIGN_IDENTITY="Apple Development: Your Name (TEAMID)"(o tu certificado Developer ID Application) a tu rc de shell para firmar siempre con tu certificado. La firma ad hoc requiere una habilitación explícita medianteALLOW_ADHOC_SIGNING=1oSIGN_IDENTITY="-"(no recomendado para pruebas de permisos). - ejecuta una auditoría de Team ID después de firmar y falla si cualquier Mach-O dentro del paquete de la app está firmado por un Team ID distinto. Establece
SKIP_TEAM_ID_CHECK=1para omitirla.
Uso
# from repo rootscripts/package-mac-app.sh # auto-selects identity; errors if none foundSIGN_IDENTITY="Developer ID Application: Your Name" scripts/package-mac-app.sh # real certALLOW_ADHOC_SIGNING=1 scripts/package-mac-app.sh # ad-hoc (permissions will not stick)SIGN_IDENTITY="-" scripts/package-mac-app.sh # explicit ad-hoc (same caveat)DISABLE_LIBRARY_VALIDATION=1 scripts/package-mac-app.sh # dev-only Sparkle Team ID mismatch workaroundNota de firma ad hoc
Al firmar con SIGN_IDENTITY="-" (ad hoc), el script deshabilita automáticamente Hardened Runtime (--options runtime). Esto es necesario para evitar cierres inesperados cuando la app intenta cargar frameworks incrustados (como Sparkle) que no comparten el mismo Team ID. Las firmas ad hoc también rompen la persistencia de permisos de TCC; consulta permisos de macOS para ver los pasos de recuperación.
Metadatos de compilación para Acerca de
package-mac-app.sh marca el paquete con:
OpenClawBuildTimestamp: UTC ISO8601 en el momento del empaquetadoOpenClawGitCommit: hash corto de git (ounknownsi no está disponible)
La pestaña Acerca de lee estas claves para mostrar la versión, la fecha de compilación, el commit de git y si es una compilación de depuración (mediante #if DEBUG). Ejecuta el empaquetador para actualizar estos valores después de cambios de código.
Por qué
Los permisos de TCC están vinculados al identificador de paquete y a la firma de código. Las compilaciones de depuración sin firmar con UUID cambiantes hacían que macOS olvidara las concesiones después de cada recompilación. Firmar los binarios (ad hoc de forma predeterminada) y mantener un id/ruta de paquete fijo (dist/OpenClaw.app) conserva las concesiones entre compilaciones, igual que el enfoque de VibeTunnel.