For AI agents: fetch the complete documentation index at /llms.txt, the full documentation corpus at /llms-full.txt, the agent skill at /skill.md, or this page as Markdown at /ko/docs/mobile/notifications.md (or send Accept: text/markdown).
알림과 푸시
인앱 수신함, 채널 기본 설정, Expo 푸시 파이프라인.
수신함과 채널 기본 설정
알림 탭은 GET /api/notifications의 워크스페이스 알림을 나열하고 알림 id에 PATCH로 읽음 표시합니다. 설정 → 알림은 웹 앱이 사용하는 것과 동일한 계약인 같은 라우트의 preferences 뷰에 대한 GET과 PATCH로 공유 채널 기본 설정(emailBilling, emailInvites, inAppProduct)을 편집합니다. 읽지 않은 수는 홈 화면에 표시됩니다.
푸시용 기기 등록
로그인 시 — 그리고 워크스페이스 전환마다 — 앱은 알림 권한을 요청하고, 앱 구성에서 EAS 프로젝트 id를 해석하고, Expo 푸시 토큰을 얻어 POST /api/mobile/push-tokens에 POST합니다. Android는 기본 채널에 높은 중요도로 등록됩니다.
등록은 registered, permission_denied, unavailable을 보고하고 절대 throw하지 않습니다 — 로그인이 푸시로 차단되는 일은 없습니다. Expo Go와 시뮬레이터는 등록을 완료할 수 없으므로 실제 검증에는 개발 빌드가 필요합니다. 토큰은 SecureStore(supastack.push.token)에 보관되어 로그아웃 시 세션 쿠키가 파기되기 전에 등록 해제할 수 있습니다.
서버 전송과 수신 확인
GET은 멤버의 토큰을 나열하고, POST는 활성 워크스페이스 아래에 토큰을 upsert하며, DELETE는 철회합니다 — 목록과 철회는 사용자 범위를 유지하므로 워크스페이스가 없는 계정도 정리할 수 있습니다. 각 사용자는 최대 20개의 기기 토큰을 유지하며, 하나 더 등록하면 가장 오래된 것이 제거됩니다.
모든 인앱 워크스페이스 알림은 best-effort로도 푸시됩니다. 서버는 100개씩 나누어 Expo 푸시 API로 보내고, ok 티켓을 기록하며, DeviceNotRegistered 토큰을 즉시 제거합니다. 선택적 서버 전용 EXPO_ACCESS_TOKEN은 그 호출에 Bearer 헤더를 추가하며 절대 로그에 남지 않습니다. 플랫폼 스케줄이 30분마다 수신 확인을 조정하고 오래된 티켓을 정리합니다 — 다른 플랫폼 스케줄과 같은 스케줄러 tick 드라이버가 필요합니다.
# Optional server-only token for authenticated Expo push sends:
# apps/web/.env.local
EXPO_ACCESS_TOKEN=알림 탭은 앱 라우트를 엽니다
발신자는 웹 경로를 data.href로 첨부합니다. 앱은 이를 검증하고(절대 슬래시 경로만, 길이 제한, 경로 탈출 불가) 알려진 경로를 네이티브 라우트로 매핑합니다 — 예를 들어 /billing은 /settings/billing으로, /dashboard는 /home으로. 로그아웃 상태에서 도착한 탭은 버퍼링되었다가 로그인이 완료되면 처리됩니다.
검증 및 문제 해결
개발 빌드에서 테스트하세요. 권한을 허용하고 거부하고, 설정 → 알림에서 푸시를 토글하고(화면은 이 기기를 enabled, disabled, denied로 보고합니다) 알림을 콜드와 웜 상태에서 탭해 보세요. 끌 때 오류가 표시되면 서버 측 등록 해제가 실패한 것이며 성공할 때까지 기기는 등록된 상태로 남습니다.