Сопутствующее приложение для macOS

Подпись для 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.

Удалённое управлениеРелиз для macOS