
追星族看一場演出,要同時追抽選結果、訂機票住宿、算跨幣別花費、記歌單、存拍立得,這些東西散落在票務網站、記帳App、相簿和便利貼裡,演出一結束就散了。
「追追推推」把這些東西收進同一本使用者自己的紀錄本,支援五種語言,已上架 App Store。
寧可少一個功能,也不讓工具替使用者做決定
App收了票券日程、遠征記帳、歌單、圖鑑、相簿、我推六類東西,不做帳號同步,資料只留在使用者手機裡。票券的「當選、落選」狀態拆掉,這種結果不該由工具替使用者定義。廣告只留主頁底部一條橫幅。
技術細節:技術棧
React Native 0.86 + Expo SDK 57 + expo-router,TypeScript strict。資料層expo-sqlite + Drizzle ORM,61支migration管25張表,zustand管UI狀態。五語在地化用i18next,繁中為翻譯來源。變現是AdMob橫幅加StoreKit 2買斷。伺服器端僅Supabase Edge Function兩支,其餘全在本機。
退件真正要改的地方,都藏在官方理由的下一層
iPad版面被擠壓時,說明文字跟著消失,「裝置不支援就整段不顯示」的寫法會把合規說明整段藏起來。更貴的錯藏在流程本身:忘記填「行銷網址」這一欄,版本一發佈就鎖死,廣告平台的驗證永久少了一個起點。
技術細節:退件條款對照
退件分別踩到網路能力誤判、隱私權限、iPad版面與HealthKit標示、同一條款重複退回、StoreKit購買流程。完整對照與回覆信紀律見 App Store 五次退件實錄:條款判讀與回覆紀律。
不會當機的壞法比當機更可怕,規範也要寫成程式碼
一批高解析度圖檔在原始碼庫裡好好放著,打包成安裝檔卻整批被丟掉,讀不到檔案的畫面元件安靜地不畫任何東西——任何一條「出狀況就悄悄退回正常畫面」的路徑,都是未來的靜默故障。App的視覺語言只有一句話:場景無色,人是唯一被打光的東西,我把它寫成自動補償對比度的函式。
底片濾鏡預設拿相機廠商的機型名當顯示名稱,多數有商標風險。麻煩的是並排效應:單看一個機型名風險很小,同品牌的名字排在同一份清單裡,讀起來就像官方授權系列。改法是把顯示名稱欄位直接拿掉,欄位留著遲早有人把品牌名填回去。
技術細節:踩過的三個坑
圖檔遺失是Expo/EAS Build打包只保留固定尺寸asset,OTA update不經過這層過濾,因此躲過驗收;對比補償邏輯集中在三支共用函式,規範以design token檔案為唯一真相來源;商標風險分級表見 UI 用了別人的品牌名:濾鏡預設的商標風險與改名執行,靜默失敗清單見 靜默失敗圖鑑:Expo 與 React Native 上那些不報錯的壞法。
沒有團隊檢查,驗收機制得自己長出來
任務狀態分六個階段,硬規則是:自動檢查全過也只能推進到「待驗」,真正的「完成」要有實機操作過的回報。修好一個問題後,我會把修法改回錯誤的寫法,確認測試真的會轉紅,避免整組測試變成永遠綠燈的假象。我也刻意不加持續整合系統:那類工具擋的是別人寫壞的程式碼,一個人一台機器沒有對象可擋。
技術細節:驗收機制的來源
六態任務狀態機與四道自動閘門的規則見 AI 協作開發:非技術 PM 的驗收閘門。
App已經上架,但帳本上還留著幾筆沒還的債
1.0.0 已上架,供應174個地區,最低支援iOS 16.4。1.0.1 已送審,唯一目的是補填漏掉的行銷網址。帳上還有幾筆債:內購事件的監聽邏輯還沒提到程式最上層,一張資料表的關聯規則只靠呼叫順序硬撐,最新的內嵌版本還沒人用實機跑過,匯出與備份功能依然不存在。