Mac 서명 (디버그 빌드)

이 앱은 보통 scripts/package-mac-app.sh에서 빌드되며, 현재 이 스크립트는:

  • 안정적인 디버그 번들 식별자를 설정합니다: ai.openclaw.mac.debug
  • 해당 번들 ID로 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 (짧은 해시). About 패널에서 빌드, git, 디버그/릴리스 채널을 표시할 수 있습니다.
  • 패키징은 기본적으로 Node 24: 스크립트가 TS 빌드 및 Control UI 빌드를 실행합니다. Node 22 LTS(현재 22.16+)도 호환성을 위해 지원됩니다.
  • 환경에서 SIGN_IDENTITY를 읽습니다. export SIGN_IDENTITY="Apple Development: Your Name (TEAMID)"(또는 Developer ID Application 인증서)를 셸 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   # 개발 전용 Sparkle Team ID 불일치 우회

Ad-hoc 서명 참고

SIGN_IDENTITY="-" (ad-hoc)로 서명할 때, 스크립트는 하드닝된 런타임(--options runtime)을 자동으로 비활성화합니다. 이는 앱이 동일한 Team ID를 공유하지 않는 내장 프레임워크(Sparkle 등)를 로드할 때 충돌을 방지하기 위해 필요합니다. Ad-hoc 서명은 TCC 권한 영속성도 깨뜨립니다. 복구 단계는 macOS 권한을 참조하세요.

About용 빌드 메타데이터

package-mac-app.sh가 번들에 다음을 표시합니다:

  • OpenClawBuildTimestamp: 패키지 시점의 ISO8601 UTC
  • OpenClawGitCommit: 짧은 git 해시 (사용 불가 시 unknown)

About 탭이 이 키를 읽어 버전, 빌드 날짜, git 커밋, 디버그 빌드 여부(#if DEBUG)를 표시합니다. 코드 변경 후 패키저를 실행하여 이 값을 갱신하세요.

이유

TCC 권한은 번들 식별자 코드 서명에 연결됩니다. UUID가 변경되는 서명되지 않은 디버그 빌드로 인해 macOS가 매 리빌드 후 권한을 잊어버렸습니다. 바이너리에 서명하고(기본적으로 ad-hoc) 고정된 번들 ID/경로(dist/OpenClaw.app)를 유지하면, VibeTunnel 방식과 일치하여 빌드 간 권한이 유지됩니다.