Подпись для macOS
Это приложение обычно собирается с помощью scripts/package-mac-app.sh, который теперь:
- устанавливает стабильный идентификатор пакета для отладки:
ai.openclaw.mac.debug - записывает Info.plist с этим идентификатором пакета (можно переопределить через
BUNDLE_ID=...) - вызывает
scripts/codesign-mac-app.shдля подписи основного бинарного файла и пакета приложения, чтобы macOS рассматривал каждую пересборку как один и тот же подписанный пакет и сохранял разрешения TCC (уведомления, доступность, запись экрана, микрофон, речь). Для стабильных разрешений используйте реальный идентификатор подписи; ad-hoc подпись требует явного согласия и ненадёжна (см. Разрешения macOS). - по умолчанию использует
CODESIGN_TIMESTAMP=auto; это включает доверенные временные метки для подписей Developer ID. УстановитеCODESIGN_TIMESTAMP=off, чтобы отключить временные метки (оффлайн-сборки для отладки). - добавляет метаданные сборки в Info.plist:
OpenClawBuildTimestamp(UTC) иOpenClawGitCommit(короткий хэш), чтобы панель "О программе" могла показывать информацию о сборке, git и канале отладки/релиза. - Для упаковки требуется Node 22+: скрипт запускает сборку TS и сборку Control UI.
- читает
SIGN_IDENTITYиз окружения. Добавьтеexport SIGN_IDENTITY="Apple Development: Your Name (TEAMID)"(или ваш сертификат Developer ID Application) в ваш shell rc, чтобы всегда подписывать вашим сертификатом. Ad-hoc подпись требует явного согласия черезALLOW_ADHOC_SIGNING=1илиSIGN_IDENTITY="-"(не рекомендуется для тестирования разрешений). - выполняет проверку Team ID после подписания и завершается ошибкой, если любой Mach-O внутри пакета приложения подписан другим Team ID. Установите
SKIP_TEAM_ID_CHECK=1, чтобы обойти проверку.
Использование
# из корня репозитория
scripts/package-mac-app.sh # автоматический выбор идентификатора; ошибка, если не найден
SIGN_IDENTITY="Developer ID Application: Your Name" scripts/package-mac-app.sh # реальный сертификат
ALLOW_ADHOC_SIGNING=1 scripts/package-mac-app.sh # ad-hoc (разрешения не сохранятся)
SIGN_IDENTITY="-" scripts/package-mac-app.sh # явная ad-hoc (те же ограничения)
DISABLE_LIBRARY_VALIDATION=1 scripts/package-mac-app.sh # обходное решение для несоответствия Team ID Sparkle (только для разработки)
Примечание об Ad-hoc подписи
При подписании с SIGN_IDENTITY="-" (ad-hoc) скрипт автоматически отключает Hardened Runtime (--options runtime). Это необходимо для предотвращения сбоев, когда приложение пытается загрузить встроенные фреймворки (например, Sparkle), которые не используют тот же Team ID. Ad-hoc подписи также нарушают сохранение разрешений TCC; см. Разрешения macOS для шагов по восстановлению.
Метаданные сборки для панели "О программе"
package-mac-app.sh добавляет в пакет:
OpenClawBuildTimestamp: ISO8601 UTC во время упаковкиOpenClawGitCommit: короткий git-хэш (илиunknown, если недоступен)
Вкладка "О программе" читает эти ключи, чтобы показать версию, дату сборки, git-коммит и является ли это отладочной сборкой (через #if DEBUG). Запускайте упаковщик для обновления этих значений после изменений кода.
Зачем это нужно
Разрешения TCC привязаны к идентификатору пакета и к подписи кода. Неподписанные отладочные сборки с изменяющимися UUID приводили к тому, что macOS забывал предоставленные разрешения после каждой пересборки. Подпись бинарных файлов (по умолчанию ad‑hoc) и сохранение фиксированного идентификатора/пути пакета (dist/OpenClaw.app) сохраняет разрешения между сборками, следуя подходу VibeTunnel.