在開發行動應用程式時,我們常常會陷入「功能越多越好、架構越穩越好」的迷思中。然而,有時候「敢於做減法」才是產品能快速落地的關鍵。
本文將與大家分享如何從旗艦級的雲端社群專案 Nailora 中,拆分並打造出一款純本地、免登入的 iOS App —— NailNote 本地美甲筆記。這款 App 的核心定位是個人專用的美甲筆記與照片相簿,所有資料皆儲存於手機本機(SQLite + 本地檔案),做到零後端、零社群。
在這次的獨立開發實踐中,筆者負責了從「離線優先(Offline-First)」的設計取捨、資料層架構,到 App Store 送審的完整流程。以下是本次專案的複盤與經驗分享。
成果速覽
在這次的開發過程中,我們最顯著的成效在於用「砍對範圍」換取開發速度:
- 極速開發:從建立專案骨架到正式送交 App Store 審查,僅僅花了約三天的時間。
- 完全離線與隱私安全:採用
expo-sqlite(WAL mode)搭配照片本機化儲存,實現了零後端、零隱私風險、100% 可離線運作。 - 簡化上架流程:由於不收集任何用戶資料,隱私問卷可直接勾選「Data Not Collected」,且無須進行複雜的加密傳輸申報,大幅縮短了合規審查的準備時間。
技術棧
本專案本著「無後端、無外接服務」的原則,技術選型極其精簡:
| 層級 | 技術 |
|---|---|
| 框架 | React Native 0.81 + Expo SDK 54 + Expo Router |
| 語言 | TypeScript strict |
| 資料 | expo-sqlite(SQLite,WAL mode,同步 API) |
| 媒體 | expo-image-picker + expo-file-system(複製到本機 documentDirectory) |
| UI | expo-glass-effect、linear-gradient、reanimated(用 pinch 手勢縮放欄數) |
| 外部依賴 | 無 Supabase、無 Auth、無後端、無 Sentry |
關鍵設計決策與經驗
在將一個龐大的雲端專案重構成純本地 App 時,我們做了幾項關鍵的架構與技術調整:
1. 資料模型「坍縮」
在母專案中,圖片資料為了因應 CDN 優化,採用了極其複雜的結構,包含多尺寸 URL、blurhash 以及縮圖機制。然而,本地版完全不需要 CDN,因此我們大膽將資料結構簡化為單一的本機 uri。這種「資料模型坍縮」成功砍掉了不必要的複雜度。
2. Migration 要能自癒
在開發 React Native 時,Fast Refresh 經常會導致資料庫的單例(Singleton)被保留,進而讓 Migration(資料庫遷移)無法正常重跑,甚至卡在半遷移狀態。
為了防止這個坑,我們不再單純依賴 user_version,而是改用 PRAGMA table_info() 來主動判斷資料表欄位是否存在。這樣一來,即使開發時遇到卡頓,重開 App 也能自動修復。
3. 功能合併與 Schema 保留
在重構過程中,我們決定將獨立的相簿功能合併進筆記的顯示模式中。不過,我們依然在資料庫中保留了原先的 Schema。這樣做既無害、零風險,也能確保未來的向下相容性。
4. 孤兒檔清理機制
當照片完全儲存在手機本機時,隨著時間推移,可能會累積許多無用的垃圾檔案。為此,我們設計了「孤兒檔清理機制」:App 每次啟動時,會自動掃描照片目錄,並刪除那些沒有被任何資料庫欄位引用的圖片檔案,避免佔用用戶寶貴的手機空間。
App Store 上架經驗
將 App 送上 App Store 往往是獨立開發者最頭痛的一關,但「純本地」的特性在這裡成了巨大的優勢:
- 極簡隱私問卷:因為資料完全存在本機、不收集任何資料,隱私問卷可以直接勾選「Data Not Collected」,省去繁瑣的隱私條款宣告。
- 免除加密申報:在設定中配置
ITSAppUsesNonExemptEncryption: false(無加密傳輸),直接省掉了繁雜的出口加密申報流程。 - 上架工作流:
- 快速完成 CRUD 與照片本地化功能。
- 完成相簿合併與排序優化。
- 設計並套用正式的 Icon、Splash 啟動畫面,備妥隱私政策頁面。
- 確保 TypeScript 檢查(tsc)全綠通過。
- 使用 EAS 進行 Production build 並順利 submit。
目前進度:已完成編譯並送出 App Store 審查(Waiting for Review),目前正靜待 Apple 審核通過後手動發佈上架。
可遷移的通用知識
從這次的 NailNote 實踐中,筆者整理出兩點非常值得複用的開發觀念:
-
「離線優先」是小團隊的利器: 如果你的產品核心功能不需要網路協作,那麼「離線優先」是降低首版複雜度與隱私合規負擔的極佳路線。沒有後端,意味著你不需要處理金鑰管理、資料列級安全性原則(RLS)以及任何潛在的資料外洩風險。
-
精準砍功能的能力: 從大型雲端專案拆分、重構出輕量工具時,最大的價值不在於你保留了什麼,而在於你「敢砍什麼」——將母專案複雜的架構,果斷精簡成本地夠用的最小可行性產品(MVP)。
小結
NailNote 的誕生證明了:有時候「少即是多」。透過將複雜的雲端架構大膽簡化,專注於本地端的流暢體驗與隱私保護,我們不僅在三天內完成了開發到送審,更為用戶提供了一個極速、安全且無負擔的美甲紀錄工具。
如果你也正準備將手邊的大型專案重構成輕量工具,不妨也試試「離線優先」與「資料模型坍縮」的思路,或許會帶來意想不到的開發效率!
相關連結
- 專案複盤-MOC
- Nailora 美甲情報 App 複盤 — 本專案的母體(雲端社群版)