Apple 캘린더 및 미리 알림¶
Apple 캘린더와 Apple 미리 알림 커넥터는 Mac의 캘린더 앱과 미리 알림 앱에 이미 설정된 계정(iCloud, Google, Exchange, 나의 Mac)에 연결됩니다. 접근 권한은 macOS가 자체 권한으로 허용하므로 로그인하거나 OAuth 클라이언트를 등록할 필요가 없고, 두 커넥터 모두 macOS 데스크톱 앱에서만 동작합니다.
모든 호출은 이메일, Google 캘린더 커넥터와 같은 승인, 감사, 되돌리기 과정을 거치고, 호출마다 감사 로그 페이지에 기록됩니다.
연결하기¶
macOS가 캘린더와 미리 알림의 권한을 따로 관리하기 때문에 두 커넥터도 따로 연결하고, 하나를 연결하는 데에는 두 단계가 필요합니다.
첫 단계는 접근을 허용하는 것입니다. macOS의 권한 요청 창은 Backend.AI GO가 처음 권한을 요청할 때 나타나는데, 사용자가 직접 요청했을 때만 뜨고 커넥터 호출이나 백그라운드 작업 때문에 요청 창이 뜨는 일은 없습니다. 한 번 답한 뒤에는 선택이 시스템 설정 > 개인정보 보호 및 보안 > 캘린더(또는 미리 알림)에 저장되어, 해당 화면에서만 바꿀 수 있습니다. 살펴보기도 같은 두 권한을 사용하므로 한쪽에서 허용하면 다른 쪽에도 허용됩니다.
두 번째 단계는 커넥터를 연결하는 것인데, 전체 접근 권한이 있어야 합니다. 항목을 바꾸거나 되돌리기 전에는 해당 항목이 항상 다시 확인되기 때문에, 캘린더에 쓰기 전용 권한만 있거나 권한이 없으면 연결이 거절되고 바꿔야 할 설정 화면이 메시지로 안내됩니다. 이 커넥터들이 사용하는 계정은 Mac마다 하나이고, 계정 ID는 local입니다.
연결을 해제하면 Backend.AI GO에서 커넥터만 제거되고 캘린더와 미리 알림에는 아무 변화가 없으며, 권한도 설정해 둔 그대로 남습니다. 아직은 연결 상태가 앱을 다시 시작한 뒤까지 유지되지 않으므로, 앱을 다시 실행했다면 각 커넥터를 다시 연결해 주세요.
커넥터가 하는 일¶
Apple 캘린더는 Google 캘린더와 같은 캘린더 호출로 사용하고, provider: "apple"과 계정 local로 구분됩니다. 미리 알림에는 별도의 호출이 있습니다.
| 커넥터 | 작업 | 분류 | 승인 |
|---|---|---|---|
| Apple 캘린더 | 캘린더 조회, 일정 조회, 일정 하나 조회 | 읽기 | 필요 없음 |
| Apple 캘린더 | 일정 만들기 | 쓰기 | 필요 없음 |
| Apple 캘린더 | 일정 수정 | 삭제/변경 | 요청함 |
| Apple 캘린더 | 일정 취소 | 삭제/변경 | 요청함 |
| Apple 미리 알림 | 목록 조회, 미리 알림 조회, 미리 알림 하나 조회 | 읽기 | 필요 없음 |
| Apple 미리 알림 | 미리 알림 만들기 | 쓰기 | 필요 없음 |
| Apple 미리 알림 | 미리 알림 완료 | 쓰기 | 필요 없음 |
| Apple 미리 알림 | 미리 알림 수정 | 삭제/변경 | 요청함 |
| Apple 미리 알림 | 미리 알림 삭제 | 삭제/변경 | 요청함 |
거버넌스는 호출마다 커넥터 태그(connector:apple_calendar, connector:apple_reminders)와 함께 도메인 태그(domain:calendar, domain:reminders)를 붙이므로, 캘린더 도메인에 정해 둔 정책은 Apple 캘린더에도 그대로 적용됩니다.
일정 목록은 macOS가 한 번에 검색하는 최대 범위인 4년 안에서만 조회할 수 있습니다. 미리 알림을 조회할 때 완료된 항목이나 전체를 요청하지 않으면 완료되지 않은 미리 알림만 반환되고, 기한이 이른 순서로 기본 100개씩, 최대 1,000개까지 표시되며, 조건에 맞는 항목이 더 있으면 결과에 함께 표시됩니다. 미리 알림의 기한은 Mac의 시간대 기준으로 날짜만 있거나 날짜와 시각이 함께 있고, 우선순위는 0(없음)부터 1(높음), 5(보통), 9(낮음)까지입니다.
Apple 캘린더가 건드리지 않는 일정¶
Apple 캘린더 커넥터로는 다른 사람이 관련된 일정이 바뀌지 않습니다. macOS로는 참석자를 추가하거나 초대에 응답할 수 없고, iCloud나 Exchange 같은 서버 캘린더가 일정이 바뀔 때 다른 사람에게 알림을 보낼지도 제어할 수 없기 때문인데요. 그래서 참석자가 있는 일정을 만들려고 하면 거절되고(초대를 보내려면 Google 캘린더나 Microsoft 365 커넥터를 사용해 주세요), 참석자가 있는 일정은 직접 주최했든 초대받았든 수정과 취소도 거절됩니다. 이런 일정은 캘린더 앱에서 바꿔 주세요. 초대 응답 기능은 아예 제공되지 않습니다.
반복 일정도 수정과 취소가 모두 거절되므로, 일정을 취소하면 정확히 일정 하나만 제거되고 반복 전체가 지워지는 일은 없습니다.
커넥터가 실행하는 작업은 다른 사람에게 전달되지 않으므로, 이메일처럼 보내기 전에 대기하는 시간 없이 바로 실행됩니다.
되돌리기¶
모든 변경은 알림 토스트나 감사 로그에서 되돌릴 수 있고, 되돌리기 전에 항목이 먼저 확인됩니다. 커넥터가 기록한 뒤에 항목이 바뀌었다면 항목은 그대로 남고, 감사 항목에는 항목이 바뀌었다는 사실이 기록됩니다.
| 작업 | 되돌리기 동작 |
|---|---|
| 일정이나 미리 알림 만들기 | 만든 뒤로 바뀌지 않았다면 제거됩니다. |
| 일정이나 미리 알림 수정 | 수정한 뒤로 바뀌지 않았다면 이전 내용으로 돌아갑니다. |
| 미리 알림 완료 | 완료한 뒤로 수정되지 않았다면 이전 상태로 돌아갑니다. |
| 일정 취소 | 같은 캘린더에 제목, 시간, 장소, 메모, 링크, 알림을 갖춘 일정이 다시 만들어집니다. |
| 미리 알림 삭제 | 같은 목록에 제목, 메모, 기한, 우선순위, 알림, 반복 설정을 갖춘 미리 알림이 다시 만들어집니다. |
마지막 두 작업은 최선 수준의 되돌리기입니다. 되살아난 항목은 새 식별자를 가진 새 항목이고, 삭제했던 미리 알림은 macOS가 제공하지 않는 하위 작업, 태그, 이미지 없이 돌아옵니다. 특정 요일이나 날짜에 반복하도록 설정한 항목은 기본 반복 주기로만 돌아옵니다. 다른 캘린더 데이터베이스가 연결되어 있을 때 기록된 항목은 되돌릴 수 없습니다.
서버나 다른 플랫폼에서¶
경로는 모든 환경에 존재하므로 REST API는 어디서나 같습니다. 연결할 캘린더 앱이 없는 환경(헤드리스 서버, Linux, Windows, 커넥터 없이 빌드한 macOS)에서는 모든 Apple 요청이 CONNECTOR_HOST_UNSUPPORTED 코드와 함께 HTTP 412로 응답되고, 아무것도 연결되지 않습니다.
REST API¶
데스크톱 앱의 관리 API에서는 같은 호출이 /api/v1 아래에서 제공됩니다. 읽기에는 agent_read 범위가, 나머지에는 agent_write 범위가 필요합니다.
| 메서드 | 경로 | 동작 |
|---|---|---|
| GET | /connectors/apple/permissions | 커넥터별 권한과 연결 여부 |
| POST | /connectors/apple/activate | {"kind": "calendar"} 또는 {"kind": "reminders"} 연결 |
| POST | /connectors/apple/deactivate | 하나의 연결 해제 |
| POST | /connectors/reminders/list-lists | 미리 알림 목록 조회 |
| POST | /connectors/reminders/list | 미리 알림 조회(listId, status, limit) |
| POST | /connectors/reminders/get | 미리 알림 하나 조회 |
| POST | /connectors/reminders/create | 미리 알림 만들기 |
| POST | /connectors/reminders/update | 미리 알림 수정(clearDue로 기한 제거) |
| POST | /connectors/reminders/complete | 미리 알림 완료 |
| POST | /connectors/reminders/delete | 미리 알림 삭제 |
Apple 캘린더는 /connectors/calendar/ 아래의 캘린더 경로를 "provider": "apple", "accountId": "local"과 함께 사용하고, primary는 macOS가 새 일정을 넣는 캘린더를 가리킵니다. 권한 요청 창은 Mac 앞에서만 나타날 수 있으므로 해당 요청에는 경로가 없습니다.
연결하려면 macOS에서 비어 있지 않은 이벤트 저장소 식별자를 읽을 수 있어야 합니다. 식별자를 읽지 못하면 다시 연결해 주세요. 기존 연결은 유지됩니다.