> ## Documentation Index
> Fetch the complete documentation index at: https://supastack.dev/llms.txt
> Use this file to discover all available pages before exploring further.
> For the full documentation corpus in one file, fetch: https://supastack.dev/llms-full.txt

# 通知與推送

應用內收件箱、渠道偏好，以及 Expo 推送管線。

## 收件箱與渠道偏好

通知標籤頁列出 GET /api/notifications 返回的工作區通知，並對通知 id 發起 PATCH 標記已讀。“設定 → 通知”編輯共享的渠道偏好 —— emailBilling、emailInvites、inAppProduct —— 通過同一路由偏好檢視的 GET 與 PATCH 完成，正是 Web 應用使用的契約。未讀數量會顯示在首頁。


## 為推送註冊裝置

登入時 —— 以及每次切換工作區時 —— 應用會請求通知許可權、從應用配置解析 EAS 專案 id、獲取 Expo 推送 token，並提交到 POST /api/mobile/push-tokens。Android 在預設渠道上以高重要性註冊。

註冊結果報告為 registered、permission_denied 或 unavailable，且絕不拋錯 —— 推送永遠不會阻塞登入。Expo Go 與模擬器無法完成註冊，真實覆蓋需要開發構建。token 儲存在 SecureStore（supastack.push.token）中，以便退出登入時在會話 Cookie 銷燬前先將其登出。


## 服務端投遞與回執

GET 列出成員的 token，POST 在當前工作區下 upsert token，DELETE 撤銷 —— 列表與撤銷保持使用者級作用域，沒有工作區的賬戶也能清理。每個使用者最多保留二十個裝置 token；多註冊一個會修剪最舊的那個。

每條應用內工作區通知也會盡力推送：伺服器以一百條為一批呼叫 Expo 推送 API，記錄 ok 票據，並立即清理 DeviceNotRegistered 的 token。可選的服務端專用 EXPO_ACCESS_TOKEN 會為這些呼叫附加 Bearer 頭，且絕不寫入日誌。一個平臺計劃任務每三十分鐘核對一次回執並清掃過期票據 —— 它與其他平臺計劃任務共用同一個排程 tick 驅動。

```
# Optional server-only token for authenticated Expo push sends:
# apps/web/.env.local
EXPO_ACCESS_TOKEN=
```


## 點選通知開啟應用路由

傳送方把 Web 路徑附在 data.href 上。應用會校驗它 —— 只允許以斜槓開頭的絕對路徑、限制長度、禁止路徑穿越 —— 並把已知路徑對映為原生路由，例如 /billing 到 /settings/billing、/dashboard 到 /home。未登入時到達的點選會先緩衝，登入完成後再回放。


## 驗證與排障

在開發構建上測試：授予與拒絕許可權、在“設定 → 通知”中切換推送 —— 介面會把此裝置報告為 enabled、disabled 或 denied —— 並分別以冷態與熱態點選通知。如果關閉時報錯，說明服務端登出失敗，裝置會保持註冊狀態直到成功為止。

[建立開發構建](https://supastack.dev/zh-tw/docs/mobile/eas-setup.md)


## 下一篇

[用量與額度](https://supastack.dev/zh-tw/docs/mobile/usage.md)
