每天半夜該送出的提醒,Futari 安靜地一則都沒送
Futari 是給兩個人一起記生活帳的家計簿。房租、保險、每個月固定扣的訂閱,這種會重複出現的帳可以設成定期帳,時間到了,Futari 會先產一張待確認的卡片,等你們確認了才記進帳裡。
卡片產好了,總得有人知道。5 月底我替 iPhone 版加上推播,整條路分成四段:App 打開時跟 Apple 登記這支手機;資料庫記住這支手機;一支小程式負責把通知交給 Apple;再設一個排程,每天半夜叫醒那支小程式,看看有沒有新的待確認卡片。四段寫完,看起來很乾淨。
然後該提醒的時間過了,什麼都沒有。沒有錯誤,沒有當掉,測試也全過。我去翻那支送通知的小程式的紀錄,才看到每一通呼叫都被它自己擋了下來,理由是來的人身分不對。
我先懷疑 Apple 那段。被拒絕嘛,直覺就是鑰匙出了問題,可能是跟 Apple 之間的憑證,也可能是我簽給 Apple 的通行證簽錯了。我盯著那支小程式看了好一陣子,它其實什麼都沒做錯。身分不對,是因為來敲門的人手上根本沒有鑰匙。
排程每天出門前,要帶一把鑰匙證明自己是系統內部的人。我原本的寫法,是把這把鑰匙寫進資料庫的設定裡,排程每次出門前去那裡拿。問題在於,我用的資料庫服務 Supabase 早在 2024 年就不讓一般使用者改那一類設定了。所以我寫的那一行設定從頭到尾沒有生效,排程每天去拿,拿到的都是空的。它帶著一把空鑰匙去敲門,門當然每一次都不開。
最難受的是,這四段單獨拿出來看,每一段都沒壞。排程有準時跑,小程式也有好好檢查身分,檢查的結果也是對的。壞掉的只是最上游餵進來的那個值,而那個值是空的,什麼錯誤都不會報。
6 月 7 日深夜我把它換掉。鑰匙改放進 Supabase 的保險箱功能(Vault),加密存著,只有資料庫自己解得開。舊的排程先取消,用同樣的內容重新排一次,只是鑰匙改從保險箱裡拿。每個環境第一次上線前,要有人手動把鑰匙放進保險箱,這一步我寫進了上線前的檢查清單,取代原本那行沒有權限執行的設定。
現在碰到一條鏈靜靜地什麼都沒發生,我會先去看最上游送進來的東西,是不是我以為的那個,再往下游一段一段找。從最下游開始猜,我這次多繞了好幾圈。
Futari 的 iPhone App 和網頁版都免費,可以從作品集找到。你們家有哪些每個月固定要付的帳,是到了那天才想起來的?
先不說了,我得去看看其他幾個排程,是不是也帶著同一把空鑰匙出門。
這段 code 寫於 2026 年 5 月底到 6 月初,文章整理於 2026 年 10 月。