mac 서명 (디버그 빌드)

이 앱은 일반적으로 scripts/package-mac-app.sh로 빌드되며, 현재:

  • 안정적인 디버그 번들 식별자 설정: ai.openclaw.mac.debug
  • 해당 번들 id로 Info.plist 작성 (BUNDLE_ID=...를 통한 오버라이드)
  • scripts/codesign-mac-app.sh를 호출하여 메인 바이너리와 앱 번들을 서명하여 macOS가 각 재빌드를 동일한 서명된 번들로 취급하고 TCC 권한 (알림, 접근성, 화면 녹화, 마이크, 음성)을 유지하도록 합니다. 안정적인 권한을 위해 실제 서명 ID를 사용하세요; ad-hoc은 opt-in이며 취약합니다 (macOS permissions 참조).
  • 기본적으로 CODESIGN_TIMESTAMP=auto 사용; Developer ID 서명을 위한 신뢰할 수 있는 타임스탬프를 활성화합니다. 타임스탬핑을 건너뛰려면 CODESIGN_TIMESTAMP=off 설정 (오프라인 디버그 빌드).
  • Info.plist에 빌드 메타데이터 주입: OpenClawBuildTimestamp (UTC) 및 OpenClawGitCommit (짧은 해시)로 About 패널이 빌드, git, 디버그/릴리스 채널을 표시할 수 있도록 합니다.
  • 패키징에는 Node 22+가 필요: 스크립트는 TS 빌드와 Control UI 빌드를 실행합니다.
  • 환경에서 SIGN_IDENTITY를 읽습니다. 항상 인증서로 서명하려면 쉘 rc에 export SIGN_IDENTITY="Apple Development: Your Name (TEAMID)" (또는 Developer ID Application 인증서)를 추가하세요. Ad-hoc 서명은 ALLOW_ADHOC_SIGNING=1 또는 SIGN_IDENTITY="-"를 통한 명시적 opt-in이 필요합니다 (권한 테스트에 권장되지 않음).
  • 서명 후 Team ID 감사를 실행하고 앱 번들 내의 Mach-O가 다른 Team ID로 서명된 경우 실패합니다. 우회하려면 SKIP_TEAM_ID_CHECK=1 설정.

사용법

# 리포지토리 루트에서
scripts/package-mac-app.sh               # ID 자동 선택; 찾을 수 없으면 오류
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)로 서명할 때, 스크립트는 자동으로 Hardened Runtime (--options runtime)을 비활성화합니다. 이는 앱이 동일한 Team ID를 공유하지 않는 내장된 프레임워크 (Sparkle 등)를 로드하려고 시도할 때 크래시를 방지하기 위해 필요합니다. Ad-hoc 서명은 또한 TCC 권한 지속성을 깨뜨립니다; 복구 단계는 macOS permissions를 참조하세요.

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 접근 방식과 일치하여 빌드 간 부여가 보존됩니다.