콘텐츠로 이동

0006. macOS 알림을 받으려고 개발 실행과 배포 빌드를 ad-hoc으로 서명하고, 알림은 메인 프로세스에서 띄운다

창이 뒤에 있을 때 Claude의 권한 대기와 작업 끝을 운영체제 알림으로 알리려 했으나, macOS에서 알림이 뜨지 않았다. 허용을 묻는 창도 뜨지 않았고, 시스템 설정의 알림 목록에 앱이 나타나지도 않았다.

Electron 42부터 macOS 알림은 코드 서명을 요구하는 API로 바뀌었고, 서명이 맞지 않는 앱의 알림은 UNErrorDomain 오류 1(알림이 허용되지 않음)로 버려진다. 개발 실행에 쓰는 내려받은 Electron과 지금까지 배포한 설치 파일은 둘 다 링커가 붙인 임시 서명뿐이라, 앱 정보 파일과 리소스가 서명에 묶여 있지 않았다. Apple Developer ID 인증서는 없다.

유료 인증서 없이, 번들 전체를 ad-hoc으로 다시 서명한다.

  • 개발 실행은 Electron.app을 node_modules/.cache 아래로 복사해 번들 ID를 com.dohyeon.belloga.dev로, 이름을 “Belloga Dev”로 바꾸고 다시 서명한 뒤, ELECTRON_OVERRIDE_DIST_PATH로 그 번들을 쓴다. pnpm dev와 pnpm start가 이 길을 탄다.
  • 배포 빌드는 electron-builder의 afterPack에서 앱 번들 전체를 다시 서명한다.

알림은 메인 프로세스의 Electron Notification으로 띄운다. 렌더러는 무엇을 알릴지만 정한다. 운영체제가 알림을 막으면 failed 이벤트가 오므로, 설정 화면에서 막힌 것을 알리고 시스템 설정을 열어 준다.

  • 개발 실행의 Electron을 제자리에서 다시 서명한다. 단계가 가장 적다. 그러나 pnpm은 패키지 파일을 저장소와 하드 링크로 나눠 쓸 수 있어, 다른 프로젝트의 Electron까지 바뀔 수 있다. 번들 ID와 이름도 바꿀 수 없어 알림에 “Electron”으로 뜬다.
  • 자체 서명 인증서를 만들어 키체인에 넣고 서명한다. 서명 정체성이 고정되지만, 사용자 컴퓨터의 키체인과 신뢰 설정을 건드려야 해 개발 환경을 준비하는 단계가 는다. ad-hoc으로 다시 서명한 Electron에서 알림이 거절 오류 대신 표시 이벤트를 내는 것을 확인해 택하지 않았다.
  • 렌더러의 웹 알림을 쓴다. 처음 구현한 방식이다. 탭 정보가 렌더러에 있어 경로가 짧지만, 개발 실행에서 권한이 늘 거절로 나오고 실패를 알 방법이 없었다.
  • Orca처럼 실제 권한 상태를 읽는 Swift 헬퍼를 둔다. 보내기 전에 막힌 것을 알 수 있지만, 네이티브 빌드와 헬퍼 서명 단계가 늘어난다. failed 이벤트와 설정의 시험 알림으로 대신한다.
  • Orca도 개발 실행에서 같은 방식(복사, 번들 ID와 이름 변경, codesign --force --deep --sign -)을 쓴다. 배포 빌드는 Developer ID로 서명한다.
  • macOS에서 개발 실행은 “Belloga Dev”, 설치한 앱은 “Belloga”로 알림 목록에 따로 나타나고, 알림 권한도 따로 관리된다.
  • pnpm exec electron .으로 직접 띄우면 서명되지 않은 Electron이 떠서 알림이 오지 않는다. 개발 실행은 pnpm dev나 pnpm start를 쓴다.
  • ad-hoc 서명은 Gatekeeper를 통과시키지 못한다. 인터넷에서 받은 설치 파일을 처음 열 때 경고가 뜨는 것은 그대로다. 받은 설치 파일에서도 알림 권한을 받을 수 있는지는 확인하지 않았다.
  • Developer ID 인증서가 생기면 electron-builder가 서명하게 되고, afterPack의 서명은 그 서명에 덮어쓰인다. 그때 공증도 함께 검토한다.